Форум сайта python.su
Здравствуйте!
Есть две таблицы, связанные отношением один-ко многим (главная и подчинённая).
Как средствами ОРМ сделать запрос, выдающий список записей в главной таблице, у которых нет подчинённых записей во второй таблице?
В MS Access для этой цели даже отдельный мастер есть, результат его работы выглядит так:
SELECT Плательщики.ключ, FROM Плательщики LEFT JOIN Платежи ON Плательщики.ключ = Платежи.[код отправителя] WHERE (((Платежи.[код отправителя]) Is Null));
Офлайн
Striver
Как средствами ОРМ сделать запрос, выдающий список записей в главной таблице, у которых нет подчинённых записей во второй таблице?
class Secondary(models.Model): name = models.CharField(max_length=10) class MainModel(models.Model): relation = models.ForeignKey(Secondary, null=True, blank=True) MainModel.objects.filter(relation__isnull=True)
Офлайн
Спасибо за ответ.
К сожалению, в Ваших моделях именно MainModel является подчинённой таблицей, несмотря на название, ведь ForeignKey в ней объявлен. При настроенном каскадном удалении строка
MainModel.objects.filter(relation__isnull=True)
class Primary(models.Model): name = models.CharField(max_length=10) class Secondary(models.Model): relation = models.ForeignKey(Primary, on_delete=models.CASCADE)
secondary_all = Secondary.objects.all().values() primary_all = Primary.objects.all() relations = {x["relation"] for x in secondary_all} primary_0 = [x for x in primary_all if x.id not in relations]
Отредактировано Striver (Апрель 10, 2017 09:05:54)
Офлайн
Может тогда такой вариант подойдет:
class Primary(models.Model): name = models.CharField(max_length=10) class Secondary(models.Model): relation = models.ForeignKey(Primary, on_delete=models.CASCADE, related_name='secondaries') Primary.objects.filter(secondaries__isnull=True)
Отредактировано scidam (Апрель 10, 2017 09:35:56)
Офлайн
Большое спасибо! Этот вариант работает.
Офлайн