【问题标题】:how to get related objects with django ValuesQuerySet?如何使用 django ValuesQuerySet 获取相关对象?
【发布时间】:2015-02-28 21:59:16
【问题描述】:

我是 django 新手,一个简单的查询阻止了我..

所以,这是我的模型的一部分:

class History(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True)
    name      = models.CharField(max_length=200)
    user      = models.ForeignKey(User)
    state     = models.ForeignKey(Status)
    reason    = models.TextField()
    gpgkey    = models.ForeignKey(Key)

def __unicode__(self):
    return self.name

class Key(models.Model):
    gpgkey     = models.CharField(max_length=128)
    gpgid       = models.CharField(max_length=32)
    path        = models.CharField(max_length=200)

    def __unicode__(self):
        return self.gpgkey

这个查询 History.objects.filter(pk=1).values() 返回:

[{'user_id': 1, 'name': u'test-4.30-6', 'timestamp': datetime.datetime(2015, 1, 1, 20, 2, 0, 578794, tzinfo=<UTC>), 'gpgkey_id': 1, 'reason': u'blablabla', 'state_id': 2, u'id': 1}]

目标是,例如。 gpgkey_id 是gpgkey : { gpgkey : "test", gpgid : "06B7FFF" } 等等所有其他相关对象。 我该怎么做?

我使用 values(),因为我想要的是字段,而不是整个模型。

【问题讨论】:

  • 您可以使用 JSON。在这里您可以找到更多信息:stackoverflow.com/a/15538391/2154023
  • 为什么要字段而不是模型实例?不要使用values(),除非您明确需要包含key:value 项的字典,并且您100% 确定不需要任何模型方法。
  • 我想把它发回去(类似api),所以我只想要值而不是模型。
  • 这更适合提到的@torm 之类的序列化程序。查看 serialization 上的 django 文档。此外,您应该查看 django rest frameworktastypie 来构建实际的 API,这两个都是轻松创建 API 的好框架。

标签: python django foreign-key-relationship django-queryset


【解决方案1】:

您必须在 values 方法参数中要求它们,不幸的是我认为您还必须为您的启动模型指定默认值:

History.objects.filter(pk=1).values('gpgkey__gpgkey', 'gpgkey__gpgid', 'gpgkey__path', 'timestamp', 'name', 'user', 'state', 'reason')

如果您有一长串属性,则可以通过遍历模型的 _meta.fields 属性并从那里构建该参数列表来制作更好的东西,但基本思想是前一个。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 2021-07-10
    • 2011-09-29
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多