以下是我处理的模型的精简版本:
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')
我 想要的是,查询集中的每个联系人都有一个.contactrole属性。它将是具有< foo'的role_scope_code的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只返回与我应用于父对象的过滤器匹配的相关对象。
答案 0 :(得分:1)
如果联系人只有一个contactrole,OneToOneField
将解决此问题。 OneToOneField
为您提供了您正在寻找的API。因此,不要使用ForeignKey
而是使用OneToOneField