Как я могу определить имя поля 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() после этого.

Источник: Отношения "многие ко многим"

Вернуться на верх