При запросе ManyToManyField из django модели необходимо использовать имя модели вместо имени поля - PullRequest
1 голос
/ 14 марта 2020

У меня есть следующая модель:

class ShoppingList(models.Model):
    name = models.CharField(max_length=100, default='Main')
    owners = models.ManyToManyField(User, through='ListOwner')


class ListOwner(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    shopping_list = models.ForeignKey(ShoppingList, on_delete=models.CASCADE)
    is_main_owner = models.BooleanField(default=False)

Далее я пытаюсь запросить ShoppingList для текущего пользователя. Я использовал это https://docs.djangoproject.com/en/dev/topics/db/models/#extra -поля-на-многих-многих-отношениях в качестве примера.

Я ожидал, что правильный способ сделать это - использовать эту конструкцию:

@login_required
def index(request):
    shopping_list = ShoppingList.objects.filter(owners__user=request.user)\
        .order_by('id').first()
# something else

но в этом случае я получаю сообщение об ошибке: Related Field got invalid lookup: user

Все работает нормально, если использовать listowner вместо owner в filter() функции, подобной этой:

shopping_list = ShoppingList.objects.filter(listowner__user=request.user)\
        .order_by('id').first()

Может кто-нибудь объяснить, почему первый не работает (хотя рекомендуется использовать его в Django документации)?

1 Ответ

0 голосов
/ 14 марта 2020

Причина, по которой он не работает, заключается в том, что ManyToManyField относится к модели User, следовательно:

ShoppingList.objects.filter(<b>owners=&hellip;</b>)

ожидает User, поиск __user недействителен, так как вы уже фильтруются по user, а модель User не имеет поля user или отношения с именем user.

. Таким образом, вы можете фильтровать с помощью:

shopping_list = ShoppingList.objects.filter(
    <b>owners=request.user</b>
).order_by('id').first()

Альтернатива - присоединиться к модели с по самостоятельно. Затем вы сначала go проходите через отношение к ListOwner, используя обратное отношение ForeignKey. Это можно сделать, указав параметр related_query_name=&hellip; [Django -doc] , который по умолчанию является именем модели в нижнем регистре. Это то, что вы сделали в своем втором решении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...