2017-01-05 2 views
0

настоящее время у меня Django модели, как этотДжанго внутреннее соединение по нулям

MyFirstObject(models.Model): 
    some_field = models.BooleanField(default=False) 

MySecondObject(models.Model): 
    first_object = models.ForeignKey(MyFirstObject, db_column='firstObjectId') 

Из-за различных проблем, наша целостность данных повреждена. Поэтому мне нужно найти экземпляры, в которых MyFirstObject был удален, но MySecondObject по-прежнему имеет строку w с внешним ключом.

база данных будет выглядеть примерно так:

TABLE my_first_object 
id someField 
1 a 
2 a 
3 b 

TABLE my_second_object 
id firstObjectId 
1 1 
2 3 
3 4 

Уведомление строке 3 таблицы my_second_object имеет firstObjectID, который не имеет соответствующую запись в таблице my_first_object. Я хочу найти все подобные экземпляры.

Если бы я делал необработанный SQL, я хотел бы сделать

SELECT my_second_object.id, my_second_object.firstObjectId 
FROM my_second_object 
LEFT JOIN ON (my_second_object.firstObjectId = my_first_object.id) 
WHERE my_first_object.id IS NULL 

В Djago, я пытаюсь

MySecondObject.objects.filter(my_first_object__id__isnull=true) 

Но когда я смотрю на запрос, в результате, он делает внутреннее соединение вместо левого соединения. У кого-нибудь есть предложения? Благодаря!

+1

Проверить http://stackoverflow.com/questions/21271835/left-join-django-orm –

+0

@AhmedHosny, да, я действительно видел, что, когда я впервые попробовал Google ответ. Но я не вижу, как решение, предлагаемое в этом сообщении, отличается от фильтра, который я пытаюсь сделать? –

+0

Он фильтрует первую модель, а не вторую. Ответ там, говорящий, что Left Join будет выполнен, когда вы выполните следующее: MyFirstObject.objects.filter (mysecondobject__isnull = True). –

ответ

0

Try так:

first_object_ids = MyFirstObject.objects.values_list('id') 
get_second_objects = MySecondObject.objects.exclude(my_first_object_id__in = first_object_ids) 
Смежные вопросы