首页 文章

检索外键对象字段Django

提问于
浏览
0

我正在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)

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

{“fields”:{“status”:1,“last_updated_at”:“2014-12-10T16:30:29.603Z”,“海拔”:0.0,“经度”:-2.21698,“用户”:2,“ provider“:”0“,”latitude“:53.456542},”model“:”app.location“,”pk“:5}

在这种情况下,我得到的对象的id为“user:2”,而不是获取用户名,所以我的问题是如何查询模型以返回相同的列表,但使用类似“User.username:edoardo”的内容 .

2 回答

  • 1

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

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

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

    Update 对于序列化:

    >>> serializers.serialize('json', Location.objects.filter(user=friends), indent=4,
    ...      use_natural_foreign_keys=True)
    
  • 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 .

相关问题