2013-06-21 4 views
0

У меня есть 3 таблицы: TextObj, User, SecurityCheck. Третья таблица имеет атрибут Foreign Key (textobj), ссылающийся на TextObj, и есть поле «много-ко-многим» (sharedWith) от SecurityCheck для пользователя.django models complex query

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)) 

мне нужно сделать запрос, который извлекает все экземпляры Textobj, которые имеют конкретного пользователя в поле sharedWith и конкретное имя файла (который является атрибутом TextObj)

+0

'TextObj.objects.filter (securitycheck__sharedWith = user, filename ...)' –

+0

- это обратные запросы, разрешенные во внешних ключах? –

+0

Да, я добавил ответ –

ответ

1

Вы можете легко сделать запросы что оболочка (обратная) зависимость:

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

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

Джа ngo предлагает мощный и интуитивно понятный способ «следить» за отношениями в поиске, заботясь о SQL JOINs для вас автоматически, за кулисами. Чтобы охватить отношения, просто используйте имя поля связанных полей в моделях, разделенных двойными подчеркиваниями, до тех пор, пока вы не попадете в нужное поле.

Он работает и наоборот. Чтобы обратиться к «обратным» отношениям, просто используйте строчное имя модели.