检索外键对象字段Django

时间:2014-12-11 11:28:57

标签: python django django-models foreign-keys django-views

我正在Django中写一个应该能够回顾我的朋友位置的视图。使用基本查询检索好友列表后,看起来非常简单;但是我还想知道的是User对象的用户名,它是我的Location模型的外键。

class Location(models.Model):
    user = models.ForeignKey(User, null=True)
    latitude = models.FloatField(max_length=100, null=True)
    longitude = models.FloatField(max_length=100, null=True)
    altitude = models.FloatField(max_length=100, null=True)
    provider = models.CharField(max_length=100, null=True)
    status = models.IntegerField(max_length=1, default='0', null=True)
    last_updated_at = models.DateTimeField(auto_now=True)

我以这种方式查询模型:

  

friends_location = Location.objects.filter(user = friends)

这是我从此查询中获得的“位置”对象之一:

  

{“fields”:{“status”:1,“last_updated_at”:“2014-12-10T16:30:29.603Z”,“海拔”:0.0,“经度”:-2.21698,“用户”:2 ,“提供者”:“0”,“纬度”:53.456542},“模特”:“app.location”,“pk”:5}

在这种情况下,我没有获取用户名,而是获取对象“user:2”的id,所以我的问题是如何查询模型以返回相同的列表但是使用类似“User.username:爱德华多”。

2 个答案:

答案 0 :(得分:1)

location对象包含用户对象,因此您可以获得如下用户名:

for location in Location.objects.filter(user=friends).select_related('user'):
    print(location.user.username)

请注意。我使用select_related来避免对db进行额外查询。

<强>更新 对于序列化:

>>> serializers.serialize('json', Location.objects.filter(user=friends), indent=4,
...      use_natural_foreign_keys=True)

答案 1 :(得分:1)

您可以使用values()选择所需的字段。在这种情况下,您必须从查询集的结果中指定要保留的所有字段。

为了获得用户名,您需要:

 # TODO: put all the fieldnames you want to keep inside the values() call
 friends_location = Location.objects.filter(user=friends).values('user__username')

---编辑---

作为对你的评论和@Alex建议的解决方案的回答,我认为你应该从Django阅读this doc