Py学习  »  Django

从django model查询ManyToManyField时,必须使用model name而不是field name

N. Verkhovin • 4 年前 • 1002 次点击  

我有以下型号:

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-fields-on-many-to-many-relationships 作为一个例子。

我希望正确的方法是使用这种结构:

@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文档中使用它)?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56921
 
1002 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    4 年前

它不起作用的原因是 ManyToManyField 指的是 User 模型,因此:

ShoppingList.objects.filter(owners=…)

期望 ,查找 __user 是无效的,因为您已经在 user ,以及 用户 模型没有 用户 用户 .

因此,您可以使用:

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

另一种选择是加入 做你自己。然后,你首先要了解 ListOwner 通过使用 ForeignKey related_query_name=… parameter [Django-doc] ,默认情况下为模型的小写名称。这就是你在第二个解决方案中所做的。