django - 使用 django 中的 "extra fields "与额外字段的多对多关系

标签 django django-models

Django 文档给出 this将额外数据与 M2M 关系关联的示例。虽然这很简单,但现在我试图利用我的观点中的额外数据,但感觉非常笨拙(这通常意味着“我做错了”)。

例如,使用上面链接文档中定义的模型,我可以执行以下操作:

# Some people
ringo = Person.objects.create(name="Ringo Starr")
paul = Person.objects.create(name="Paul McCartney")
me = Person.objects.create(name="Me the rock Star")
# Some bands
beatles = Group.objects.create(name="The Beatles")
my_band = Group.objects.create(name="My Imaginary band")
# The Beatles form
m1 = Membership.objects.create(person=ringo, group=beatles,
    date_joined=date(1962, 8, 16),
    invite_reason= "Needed a new drummer.")
m2 = Membership.objects.create(person=paul, group=beatles,
    date_joined=date(1960, 8, 1),
    invite_reason= "Wanted to form a band.")
# My Imaginary band forms
m3 = Membership.objects.create(person=me, group=my_band,
    date_joined=date(1980, 10, 5),
    invite_reason= "Want to be a star.")
m4 = Membership.objects.create(person=paul, group=my_band,
    date_joined=date(1980, 10, 5),
    invite_reason= "Wanted to form a better band.")

现在,如果我想打印一个简单的表格,为每个人提供他们加入每个乐队的日期,目前我正在这样做:

bands =  Group.objects.all().order_by('name')

for person in Person.objects.all():
    print person.name, 
    for band in bands:
        print band.name,
        try:
            m = person.membership_set.get(group=band.pk)
            print m.date_joined,
        except:
            print 'NA',
    print ""

这感觉非常难看,尤其是“m = person.membership_set.get(group=band.pk)”位。我对这整件事的理解是错的吗?

现在假设我想按照人们加入特定乐队(比如披头士乐队)的日期对他们进行排序,是否有任何 order_by 子句可以放在 Person.objects.all() 上让我这样做?

如有任何建议,我们将不胜感激。

最佳答案

您应该查询成员(member)模型:

members = Membership.objects.select_related('person', 'group').all().order_by('date_joined')

for m in members:
    print m.band.name, m.person.name, m.date_joined

在这里使用 select_lated 可以避免 1 + n 查询问题,因为它告诉 ORM 进行连接并在一个查询中选择所有内容。

关于django - 使用 django 中的 "extra fields "与额外字段的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1281118/

相关文章:

django - 在 Django 模型中按多对多关系排序

django -/profile/:The 'image' attribute has no file associated with it 处的值错误

python - Tornado +桃子。重新启动损坏的连接

database - Django - 这些查询集会被缓存吗?

django - Django中的多个对象类型引用

python - 如何制作字段名称与模型字段名称不同的 Django 模型表单?

python - Django 保存或更新模型

python 和 postgres 总是共享一个 CPU 内核?

django - GeoDjango 从 json 或点保存数据

python - 如何过滤 Django ModelForm 中的 ForeignKey 选择?