Как я могу определить имя поля ManyToManyField в django?
У меня есть эти отношения
Class Item(models.Model):
pass
Class Category(models.Model):
items = models.ManyToManyField(Item)
Я могу определить имя поля как items
для категории и получить доступ к нему через category.items
, но я хочу определить имя поля для Item тоже как item.categories
, а не по умолчанию item.category
Как я могу этого достичь?
Видите, 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
После этого вы можете перечислить свои требования в файле 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 %}
Надеюсь, это решение поможет вам ...
Спасибо!
Поле many to many не является фактическим полем. Если вы посмотрите на сгенерированную схему, вы не найдете это поле в качестве столбца ни в одной из таблиц. Что происходит на заднем плане - django создает таблицу ItemCatagory
.
class ItemCatagory(models.Model):
item = modes.ForegnKeyField(Item, related_name="catagories", on_delete... )
catagory = models.ForegnKeyField(Item, related_name="items", on_delete... )
catagory.items
даст вам ItemCatagory
RelatedObject
, а если вы сделаете catagoty.items.all()
, это даст вам QuerySet[ItemCatagory]
. Так что метод по умолчанию model.save()
не добавит эти корабли. Так что вам придется изменить метод save
на любой из моделей.
При вызове Item.objects.create()
необходимо опустить categories
из args. После этого вы можете вызвать set()
для установки категорий.
item = Item.objects.create()
item.categories.set(categories)
Если у вас есть только одна категория для добавления, вы можете вызвать add()
вместо этого:
item = Item.objects.create()
item.categories.add(category)
Примечание: и add()
, и set()
сохраняют обновление в базе данных, поэтому вам не нужно вызывать item.save()
после этого.
Источник: Отношения "многие ко многим"