我有型号ModelA
class ModelA(models.Model):
user_id = models.ForeignKey(User)
#other fields
class Friend(models.Model):
user_id = models.ForeignKey(User)
name = charfield
class Enemy(models.Model):
user_id = models.ForeignKey(User)
我想从ModelA过滤朋友的名字,所以:
ModelA.objects.annotate(friend=Friend.objects.get(user_id=user_id)).filter(friend__name='abc')
在这里,注释朋友没有工作,但上面说明了我的要求。我想要ModelA的所有记录,其朋友的名字是' abc'。怎么样?
答案 0 :(得分:0)
这看起来有点混乱,你正在为单一类型创建所有这些模型,不需要user_id就像用户会没事,你应该提供相关的名称,以便能够理解你想要查询的内容(虽然再次......你不是在干自己),注释用于聚合,而不是你想要做什么,如果你想提出一个你应该使用额外的新值,除非你的例子清楚正确结构化,你甚至不需要额外的()查询。
答案 1 :(得分:0)
使用annotate()
完全没必要。 annotate()
用于将聚合附加到模型(例如用户的friend_set的Count())之类的事情。 https://docs.djangoproject.com/en/dev/topics/db/aggregation/#aggregating-annotations
所以,让我们从头开始......
为什么你的外键名为" user_id"?使用ORM时,Friend.user_id将返回用户对象,而不仅仅是用户的整数主键。 ModelA和Friend中您的房产名称应反映这一点。 更改' user_id'到用户' 。
所以,我在这里定义这些模型:
class ModelA(models.Model):
user = models.ForeignKey(User)
class Friend(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100)
class Enemy(models.Model):
user = models.ForeignKey(User)
接下来,您会发现ModelA
与User
相关的所有实例,而Friend
又有results = ModelA.objects.filter(user__friend__name='abc')
名为' abc',就像这样:
{{1}}
注意:令牌用户,朋友和姓名之间有两个下划线(_)。
我强烈建议你花更多的时间在这里阅读Django&#ORM的文档:https://docs.djangoproject.com/en/dev/topics/db/queries/