Django ORM: проверьте, не имеет ли модель записи внешнего ключа в другой модели

#django #django-orm

#django #django-orm

Вопрос:

Итак, у меня есть эти 2 модели:

 class Site(models.Model):
    ...
    ...
  

и еще один:

 class SiteInfo(models.Model):
    ...
    ...
    site = models.ForeignKey(Site)
  

Есть ли способ получить сайты, у которых нет записи в SiteInfo?

Ответ №1:

Site.objects.filter(siteinfo__isnull=True)

Комментарии:

1. У меня сейчас нет рядом кода для проверки вашей идеи, но я вижу, что вы меняете все сайты, у которых столбец site равен null… Итак, я предполагаю, что вы имели в виду SiteInfo.

2. Мне нужно, чтобы каждая запись в SiteInfo имела корреляцию с сайтом. Мне интересно узнать, на каких сайтах SiteInfo еще не определен. Сработает ли ваше предложение для этого?

3. Я неправильно понял ваш вопрос. 🙂 Вот правильное решение. «Чтобы ссылаться на «обратную» связь, просто используйте название модели в нижнем регистре». Документы

4. Это больше похоже на это! Не знал об этом. Я протестирую это, как только смогу. Спасибо!

5. Мне пришлось добавить .distinct() , так как в противном случае я получил бы дубликаты.

Ответ №2:

Существует общий способ найти список всех обратных отношений модели.

 reverse_model_array = [f.related_model for f in model._meta.get_fields() 
if f.auto_created and not f.concrete]
  

Здесь будут перечислены все модели, которые имеют ссылку на эту модель (внешний ключ, ключ «многие ко многим» и т.д.)

Ответ №3:

Я думаю, что это сработает, но не настолько эффективно:

с помощью_но_сайт_инфо = [сайт для сайта в Site.objects.all(), если site.site_infos_set.all().count() == 0]

Комментарии:

1. Я согласен с DrTyrsa в этом вопросе. Если у меня более 1000 сайтов, сервер отправит запросы.

2. «Я думаю, это сработает, но не настолько эффективно:» Я сказал это до того, как написал это, думая, что у вас 1000 сайтов.

3. Я понимаю. В любом случае спасибо за вашу идею 😉