Найти - Пользователи
Полная версия: Вывод только тех записей первой модели у которых есть связные поля другой модели
Начало » Django » Вывод только тех записей первой модели у которых есть связные поля другой модели
1
info.rss
class One(models.Model):
...
    def img(self):
        return Two.objects.filter(rel=self)
class TwoImg(models.Model):
    rel = models.ForeignKey(One, on_delete=models.CASCADE)

Как сделать вывод только тех записей One, которые имеют есть связные поля в инлайновой модели Two
botinag
One.objects.get(pk=1).twoimg_set.exists()
покажет есть ли связи у конкретного объекта.
info.rss
Да, пробовал
One.objects.get(pk=1).twoimg_set.exists()
при выводе в шаблон
{% fon n in one %}
{{n.img}}
{% endfor %}

выдает:
False
True
True
False
...
А как сделать вывод только True значений?
botinag
{% fon n in one %}
{% if n.img %}
{{ n.img }}
{% endif %}
{% endfor %}
info.rss
да в шаблоне делал, но если сделать так:
{% fon n in one|slice:":10" %}
    {% if n.img %}
        {{ n.img }}
    {% endif %}
{% endfor %}
то вместо 10-ти значений в результате, как хотелось бы, он отнимет не существующие и оставит скажем 5

поэтому думаю надо сделать на уровне модели сперва выборку имеющих связи с Two.. если я правильно понимаю


вообще до этого было так, во вьюхе:
a0 = One.active_objects.select_related().all().order_by('-since')
a1 = a0.values_list('rel', flat=True).distinct()
b = a0.filter(pk__in=list(a1))[:10]
но мне кажется это как-то длинно и можно сделать лучше
info.rss
кто-нибудь
inoks
{% fon n in one %}
    {% if n.twoimg_set.exists %}
        {{ n.img }}
    {% endif %}
{% endfor %}
info.rss
Это, к сожалению, не решает:
inoks
{% fon n in one|slice:":10" %}
    {% if n.twoimg_set.exists %}
        {{ n.img }}
    {% endif %}
{% endfor %}
inoks
то вместо 10-ти значений в результате, как хотелось бы, он отнимет не существующие и оставит скажем 5

т.е в блоке шаблона ожидаем получить все-таки ровно 10 значений, даже не 9, только 10
но в случае наличия результата в списке с not exists, получим 9 и менее
lead-in
Если нужно отображать по 10 штук именно тех One которые имеют связанные TwoIng, то можно использовать аннотацию\агрегацию:

from django.db.models import Count
one_objects = One.objects.filter().annotate(Count('twoimg')).filter(twoimg__count__gt=0)

{% fon n in one_objects|slice:":10" %}
      {{ n.img }}
{% endfor %}
info.rss
не понимал откуда поле twoimg, оказывается оно его создает что ли
Спасибо огромное!
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