Django通过查询相关表来访问M2M字段的属性

时间:2014-07-05 17:33:36

标签: django django-models django-queryset django-orm

我有一张看起来像这样的表

class Person(User):
    """
    This model represents person's personal and
    professional details.
    """
    attribute1 = models.CharField(max_length=100)
    attribute2 = models.TextField()
    attribute3 = models.TextField()
    attribute4 = models.ForeignKey(Receptionist)
    referred_attribute1 = models.ManyToManyField(Hobby)


class Hobby(models.Model):
    name = models.CharField(max_length=100)

用例: P1具有爱好 h1,h2,h3(在表Hobby中定义[作为3个单独的条目])。 现在我想检索一个Person对象,它包含它拥有的所有属性和属性,包括Hobbies。为此,我正在执行以下操作:

Person.objects.values("attribute1",
                      "attribute2",
                      "referred_attribute1").get(attribute3="p1's attribute")

我想要的是:

{'attribute1':'p1_attribute1', 
 'attribute2':'p1_attribute2', 
 'referred_attribute':['h1','h2','h3']}

我得到的是:

[{'attribute1':'p1_attribute1', 
  'attribute2':'p1_attribute2', 
  'referred_attribute':'h1'},
 {'attribute1':'p1_attribute1', 
  'attribute2':'p1_attribute2', 
  'referred_attribute':'h2'}, 
 {'attribute1':'p1_attribute1', 
  'attribute2':'p1_attribute2', 
  'referred_attribute':'h3'}]

有没有办法直接从查询集中获取我想要的结果?因为我不想手动重新安排上述结果!

2 个答案:

答案 0 :(得分:0)

请改为:

p1 = Person.objects.get(attribute3="p1's attribute")

p1是此人的实例,然后您可以从中检索所有属性。例如:

p1_attribute1 = p1.attribute1
p1_hobbies = p1.referred_attribute1.all()

现在您可以根据需要重新排列数据,例如,按如下方式列出业余爱好列表:

hobby_list = p1_hobbies.values_list('name', flat=True)

我会将referenced_attribute1重命名为业余爱好以获取代码可读性

答案 1 :(得分:0)

这样的事情应该适用于这种情况:

    [{'attribute1': res.attribute1, 'attribute2': res.attribute2,
    'referred_attribute1': [a.name for a in res.referred_attribute1.all()]}
     for res in Person.objects.prefetch_related('referred_attribute1').filter(attribute3="p1's attribute")]

另见Django's Prefetch-related