以下是我正在处理的模型的简化版本:

class Contact(models.Model):
    contact_no = models.IntegerField(primary_key=True)
    email_address = models.CharField(max_length=60, null=True)

class ContactRole(models.Model):
    contact_no = models.ForeignKey(Contact, primary_key=True, db_column='contact_no')
    role_code = models.CharField(primary_key=True, max_length=16)
    role_scope_code = models.CharField(primary_key=True, max_length=16)


联系人可以并且几乎总是有许多ContactRoles。

我想要一个相关ContactRole的role_scope_code为'foo'的联系人列表。我知道我可以用:

Contact.objects.filter(contactrole__role_scope_code='foo')


我还希望查询集中的每个Contact具有单个.contactrole属性。这将是具有role_scope_code'foo'的ContactRole。相反,我得到了一个与contact_no匹配的所有ContactRoles的集合,因此要获取ContactRole的属性,我必须执行以下操作:

contacts = Contact.objects.filter(contactrole__role_scope_code='foo')
for contact in contacts:
    print contact.contactrole_set.filter(role_scope_code='foo')[0].role_code


我必须对role_scope_code进行两次过滤!似乎一点都不干。我正在寻找的是一个查询,它将使我拥有一个像这样工作的集合:

contacts = Contact.objects.filter(contactrole__role_scope_code='foo')
for contact in contacts:
    print contact.contactrole.role_code


在我的生命中,我无法弄清楚如何告诉Django仅返回与我应用于父对象的过滤器匹配的相关对象。

最佳答案

OneToOneField将解决此问题,前提是某个联系人只有一个联系人角色。 OneToOneField为您提供所需的api。因此,使用ForeignKey代替使用OneToOneField

10-08 06:56