【问题标题】:Retrieve Foreign Key Object Field Django检索外键对象字段 Django
【发布时间】:2015-02-09 20:59:17
【问题描述】:

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

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

{“字段”:{“状态”: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:爱德华多”。

【问题讨论】:

  • 这不是您从查询中得到的:这是对该查询结果进行某种序列化操作的输出。你应该准确地展示你为得到它所做的事情。
  • 没错,如果我将朋友的位置作为 http 响应返回,我只会得到“Location objectLocation objectLocation object”,我想这是有道理的。

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


【解决方案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

【讨论】:

  • 我得到类似“'dict' object has no attribute '_meta'”的东西,我不确定这意味着什么..
  • 你应该在你的查询集上调用它,在任何类型的序列化之前。您收到此错误是因为您可能在序列化对象上调用 values()
  • 我刚刚复制了您的查询,然后序列化了friends_location。亚历克斯似乎有一个很好的提示,但即使在那里我仍然得到用户对象 ID。
  • 我的答案编辑中指出的文档可能会为您提供一些关于如何在序列化查询集时获取用户名的线索。祝你好运!
  • 那个u是因为它是an unicode (string) literal。乐意效劳! :)
【解决方案2】:

位置对象包含用户对象,因此您可以像这样获取用户名:

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

注意。我使用select_related 来避免对数据库的额外查询。

更新 对于序列化:

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

【讨论】:

  • 好的,但是这样你只是选择了用户名?只需将用户字段更改为用户名即可获取整个 json 对象,这样我就可以将位置与用户名相关联。
  • 嗨亚历克斯,我已经尝试以这种方式进行序列化,但我仍然得到“用户”:2。我是否必须以某种方式包含您在序列化中发布的第一个查询才能获得 user:edoardo?谢谢。
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 2017-11-02
  • 2014-09-29
  • 2015-08-16
  • 2018-05-23
  • 1970-01-01
  • 2013-08-14
  • 2018-05-02
相关资源
最近更新 更多