【问题标题】:Django Accessing the attributes of an M2M field by querying the related tableDjango 通过查询相关表来访问 M2M 字段的属性
【发布时间】:2014-08-26 15:44:55
【问题描述】:

我有一张像这样的桌子

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)

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

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'}]

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

【问题讨论】:

  • 这不是一个直接的答案,只是一个建议:对多对多关系使用不同的查询,然后加入它。
  • “使用不同的查询”- 你能详细说明一下吗?

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


【解决方案1】:

改为这样做:

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)

为了代码的可读性,我会将refered_attribute1 重命名为爱好

【讨论】:

  • 我已经这样做了。令人烦恼的是我有大量的数据并且重新排列这不是最有效的方法。我需要一个可以执行的查询集,以获取所需格式的所需值。 PS:我把它命名为“爱好”。出于上下文目的,将其放在这里。 :)
【解决方案2】:

在这种情况下应该可以这样:

    [{'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

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 2020-11-24
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    • 2021-09-27
    相关资源
    最近更新 更多