Найти - Пользователи
Полная версия: Фильтр записей без подчинённых
Начало » Django » Фильтр записей без подчинённых
1
Striver
Здравствуйте!
Есть две таблицы, связанные отношением один-ко многим (главная и подчинённая).
Как средствами ОРМ сделать запрос, выдающий список записей в главной таблице, у которых нет подчинённых записей во второй таблице?

В MS Access для этой цели даже отдельный мастер есть, результат его работы выглядит так:
 SELECT Плательщики.ключ, 
FROM Плательщики LEFT JOIN Платежи ON Плательщики.ключ = Платежи.[код отправителя]
WHERE (((Платежи.[код отправителя]) Is Null));
Можно это и для Джанго в SQL написать, но, по идее, должен быть способ через ОРМ отфильтровать.

Самый тупой вариант - взять все записи из обеих таблиц и фильтровать средствами Питона применять не хочется (или придётся?)

Поиск ничего не дал (или не знаю, как это правильно искать).

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

Striver
Спасибо за ответ.
К сожалению, в Ваших моделях именно 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)
Как получить список записей таблицы Primary, не связанных ни с одной записью в Secondary?

Временно сделал тупо:
 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]

scidam
Может тогда такой вариант подойдет:

  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)

Striver
Большое спасибо! Этот вариант работает.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB