如何在django中定义ManyToManyField名称?

piwo6bdm  于 2022-12-01  发布在  Go
关注(0)|答案(1)|浏览(119)

我有这样的关系

Class Item(models.Model):
   pass

Class Category(models.Model):
   items = models.ManyToManyField(Item)

我可以将类别的字段名称定义为items,并通过category.items访问它,但我也想将项目的字段名称定义为item.categories,而不是默认的item.category
我该如何实现它?

更新

已尝试
items = models.ManyToManyField(Item, related_name = "categories")
但我得到
TypeError: Direct assignment to the reverse side of a many-to-many set is prohibited. Use categories.set() instead.
Item.object.create(**data)

6yt4nkrj

6yt4nkrj1#

看,ManyToManyField不能与相关模型建立反向关系,因为python是解释语言,所以它不能读取前一个模型的模型类。相反,你可以做一件事...

# models.py

class Item(models.Model):
    item_name = models.CharField(max_length=255, default="")

    def __str__(self):
        return self.item_name

class Category(models.Model):
    category_name = models.CharField(max_length=255, default="")
    items = models.ManyToManyField(Item)

    def __str__(self):
        return self.category_name

之后,您可以在www.example.com文件中列出您的要求views.py。

# views.py

def get_items_by_categories(request):
    
    # Here, you will receive a set of items ...
    
    get_categories = Category.objects.all()

    # Filter out items with respect to categories ...

    get_items_list = [{"category": each.category_name, "items": each.items} for each in get_categories]

    return render(request, "categories.html", {"data": get_items_list})

使用categories.html文件中的类别迭代项目。

{% for each in data %}
    {% for content in each %}
        {{content.category}}
        {% for item in content.items.all %}
            {{item.item_name}}
        {% endfor %}
    {% endfor %}
{% endfor %}

我希望这个解决方案能帮助你..
谢谢您!

相关问题