以下是我正在处理的模型的简化版本:
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