django values_list中的所有字段的外键

时间:2014-12-24 10:36:02

标签: python django

我有一个带有外键的类到另一个类:

class MyEvent(models.Model): 
    msg = models.ForeignKey(MyMessage)  
    event_type = models.IntegerField(choices=EVENTS_TYPES)

class MyMessage(models.Model): 
    notification = models.IntegerField(choices=EVENTS_TYPES2)  
    name = models.CharField(max_length=20, null=False, blank=False) 
    description = models.CharField(max_length=150, null=False, blank=False) 

结果:

MyEvent.objects.all().values('msg','event_type')

是:

[{'msg': 18L,'event_type': 1L}, {'msg': 15L,'event_type': 2L}]

但是是否也可以获取外键(MyMessage)对象的所有值? (我想在没有明确引用的情况下得到。 - 不像在MyEvent.objects.all()中添加'msg__description'。值('msg','event_type'))

我想要的结果是:

[{'msg': 18L,'msg__name': 'dd','msg__description': 'kkk','event_type': 1L}, {'msg': 15L,'msg__name': 'dd','msg__description': 'kkk','event_type': 2L}]

3 个答案:

答案 0 :(得分:9)

您可以在值函数中引用外键属性:

MyEvent.objects.all().values('msg','event_type', 'msg__name', 'msg__description')

答案 1 :(得分:1)

您可以使用基于msg__的列表推导创建每个值前加MyMessage._meta的字段名称列表。然后使用.values(*list_of_fields)解压缩值。

除此之外,这是不可能的。 values()仅接受字段名称作为位置参数,因此您必须在调用values()之前隐式生成参数。

答案 2 :(得分:-1)

您应该将相关名称添加到这样的外键

class MyEvent(models.Model): 
    msg = models.ForeignKey(MyMessage,related_name='message')  
    event_type = models.IntegerField(choices=EVENTS_TYPES)

class MyMessage(models.Model): 
    notification = models.IntegerField(choices=EVENTS_TYPES2)  
    name = models.CharField(max_length=20, null=False, blank=False) 
    related_name=description = models.CharField(max_length=150, null=False, blank=False) 

然后您可以使用相关名称检索它。像这样:

objs=MyEvent.objects.all()
objs[0].message.all() # this is the Mymessage record

然后您可以随意创建列表