2013-06-21 176 views
0

我有3个表格,TextObj,User,SecurityCheck。第三个表具有一个引用TextObj的外键属性(textobj),并且存在从SecurityCheck到User的多对多字段(sharedWith)。django模型复杂查询

class SecurityCheck(models.Model): 
    textobj=models.ForeignKey(TextObj) 
    owner=models.CharField(max_length=255) 
    sharedWith=models.ManyToManyField(User) 

    def __init__(self,owner,filename,requestingUsername): 
     self.owner=owner 
     self.textobj=TextObj.filter(filename=filename) 
     self.sharedWith.add(User.objects.filter(username=requestingUsername)) 

,我需要做哪些获取具有在sharedWith领域特定用户和特定的文件名(这是TextObj的属性)

+0

'TextObj.objects.filter(securitycheck__sharedWith =用户,文件名...)' –

+0

的反向查询的外键允许吗? –

+0

是的,我已经添加了答案 –

回答

1

你可以轻松地查询Textobj的所有实例的查询跨度(反向)的关系:

TextObj.objects.filter(securitycheck__sharedWith=user, filename="foo") 

https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

Dja保护ngo提供了一种强大而直观的方式来在查找中“追踪”关系,在幕后自动为您处理SQL JOIN。要跨越关系,只需使用模型中相关字段的字段名称(用双下划线分隔),直到您到达所需的字段。

它也向后工作。要引用“反向”关系,只需使用模型的小写名称即可。