社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

N. Verkhovin • 5 年前 • 1795 次点击  

我有以下型号:

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
 
1795 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Willem Van Onsem
Reply   •   1 楼
Willem Van Onsem    5 年前

它不起作用的原因是 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] ,默认情况下为模型的小写名称。这就是你在第二个解决方案中所做的。