#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. Я понимаю. В любом случае спасибо за вашу идею 😉