我有一张看起来像这样的表
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'}]
有没有办法直接从查询集中获取我想要的结果?因为我不想手动重新安排上述结果!
答案 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")]