通过django

时间:2017-01-02 05:49:55

标签: django django-models

我有一个简单的Relation模型,用户可以像stackoverflow一样关注标记。

class Relation(models.Model):
    user = AutoOneToOneField(User)
    follows_tag = models.ManyToManyField(Tag, blank=True, null=True, through='TagRelation')

class TagRelation(models.Model):
    user = models.ForeignKey(Relation, on_delete=models.CASCADE)
    following_tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
    pub_date = models.DateTimeField(default=timezone.now)

    class Meta:
        unique_together = ['user', 'following_tag']

现在,要获取用户所关注的所有标记的结果:

kakar = CustomUser.objects.get(email="kakar@gmail.com")
tags_following = kakar.relation.follows_tag.all()

这很好。

但是,要访问中间字段,我必须查看其他查询的大量列表。假设我想在用户开始关注标签时显示,我将不得不这样做:

kakar = CustomUser.objects.get(email="kakar@gmail.com")
kakar_relation = Relation.objects.get(user=kakar)
t1 = kakar.relation.follows_tag.all()[0]
kakar_t1_relation = TagRelation.objects.get(user=kakar_relation, following_tag=t1)
kakar_t1_relation.pub_date

正如你所看到的,只是为了获得日期,我必须经历如此多的查询。这是获得中间值的唯一方法,还是可以优化?此外,我不确定这种模型设计是否可行,所以如果您有任何推荐或建议,我将非常感激。谢谢。

1 个答案:

答案 0 :(得分:1)

你需要使用Double下划线,即(__)进行ForeignKey查找, 像这样:

user_tags = TagRelation.objects.filter(user__user__email="kakar@gmail.com").values("following_tag__name", "pub_date")

如果您需要标记的名称,可以在查询中使用 following_tag__name ,如果您需要ID,则可以使用 following_tag__id

为此你需要遍历上面的查询集的结果,如下所示:

for items in user_tags:
    print items['following_tag__name']
    print items['pub_date']

还有一件事,关键词将返回词典的列表,您可以通过上述方法迭代它,如果您使用 values_list 代替,它将返回元组的列表。 Read further from here