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