django注释实例不工作

时间:2014-06-11 23:05:32

标签: django

我有型号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'。怎么样?

2 个答案:

答案 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)

接下来,您会发现ModelAUser相关的所有实例,而Friend又有results = ModelA.objects.filter(user__friend__name='abc') 名为' abc',就像这样:

{{1}}

注意:令牌用户,朋友和姓名之间有两个下划线(_)。

我强烈建议你花更多的时间在这里阅读Django&#ORM的文档:https://docs.djangoproject.com/en/dev/topics/db/queries/