Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 7, 2017 22:39:00

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Фильтр записей без подчинённых

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

В MS Access для этой цели даже отдельный мастер есть, результат его работы выглядит так:

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

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

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



Офлайн

#2 Апрель 8, 2017 05:18:51

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Фильтр записей без подчинённых

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)

Офлайн

#3 Апрель 10, 2017 08:34:42

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Фильтр записей без подчинённых

Спасибо за ответ.
К сожалению, в Ваших моделях именно 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]



Отредактировано Striver (Апрель 10, 2017 09:05:54)

Офлайн

#4 Апрель 10, 2017 09:34:19

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Фильтр записей без подчинённых

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

  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)

Офлайн

#5 Апрель 10, 2017 11:51:24

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Фильтр записей без подчинённых

Большое спасибо! Этот вариант работает.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version