2015-02-05 3 views
0

У меня есть модели, как этотДжанго: quering модель со многими-ко-многим полям

class Book(models.Model): 
    title = models.CharField(max_length=254) 
    subtitle = models.CharField(max_length=254, null=True, blank=True) 
    subjects = models.ManyToManyField(Subject) 

class Subject(models.Model): 
    name = models.CharField(max_length=255) 
    description = models.CharField(max_length=254, null=True, blank=True) 

Теперь, когда я сделать

Book.objects.get_or_create(subjects=[2,4] , title='Genetics', subtitle='Theory of Genetics') 

Здесь значение предметов список соответствующих предметов ид. Это дает мне ошибку, говоря, что аргументы должны быть строкой или номером TypeError.

Как я могу справиться с этой ситуацией с несколькими темами?

ответ

1

используется оператор __in

Book.objects.filter(subjects__in=[2,4]) 

Он также может быть использован с QuerySet

Book.objects.filter(
    subjects__in=Subject.objects.filter(name__contains="interesting")) 

Если вместо этого вы хотите книгу с как субъектов, а не только любой из них мы может использовать объект Q

Book.objects.filter(Q(subject__in=[2]) & Q(subject__in=[4])) 

Обратите внимание, что любой из операторов действительно логически вписывается в get_or_create, потому что не существует достаточной информации для создания, поэтому вам, возможно, придется разделить ее.

+0

первый запрос показывает все книги, у которых есть предметы, имеющие id = 2 или предметы, имеющие id = 4. В нем нет книг, в которых есть обе темы – wrufesh

+0

@wrufesh, вы не сказали, что хотите, чтобы ваш код делал. –

+0

Да, он показывает записи с обоими, он не показывает исключительно записи с обоими. – krs

Смежные вопросы