Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Вывод только тех записей первой модели у которых есть связные поля другой модели [RSS Feed]

#1 Дек. 12, 2014 14:24:10

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

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

Офлайн

#2 Дек. 12, 2014 14:54:19

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

One.objects.get(pk=1).twoimg_set.exists()
покажет есть ли связи у конкретного объекта.

Офлайн

#3 Дек. 12, 2014 15:07:01

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

Да, пробовал

One.objects.get(pk=1).twoimg_set.exists()
при выводе в шаблон
{% fon n in one %}
{{n.img}}
{% endfor %}

выдает:
False
True
True
False
...
А как сделать вывод только True значений?

Офлайн

#4 Дек. 12, 2014 15:10:39

botinag
Зарегистрирован: 2014-02-20
Сообщения: 179
Репутация: +  35  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

{% fon n in one %}
{% if n.img %}
{{ n.img }}
{% endif %}
{% endfor %}

Офлайн

#5 Дек. 12, 2014 15:20:39

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

да в шаблоне делал, но если сделать так:

{% 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 (Дек. 12, 2014 15:31:16)

Офлайн

#6 Дек. 12, 2014 16:22:13

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

кто-нибудь

Отредактировано info.rss (Дек. 12, 2014 16:33:15)

Офлайн

#7 Дек. 12, 2014 17:29:58

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Вывод только тех записей первой модели у которых есть связные поля другой модели

{% fon n in one %}
    {% if n.twoimg_set.exists %}
        {{ n.img }}
    {% endif %}
{% endfor %}

Офлайн

#8 Дек. 13, 2014 07:22:35

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

Это, к сожалению, не решает:

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 и менее

Отредактировано info.rss (Дек. 13, 2014 07:25:28)

Офлайн

#9 Дек. 13, 2014 08:54:16

lead-in
Зарегистрирован: 2014-10-13
Сообщения: 19
Репутация: +  5  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

Если нужно отображать по 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 %}

Офлайн

#10 Дек. 13, 2014 10:31:47

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Вывод только тех записей первой модели у которых есть связные поля другой модели

не понимал откуда поле twoimg, оказывается оно его создает что ли
Спасибо огромное!

Офлайн

  • Начало
  • » Django
  • » Вывод только тех записей первой модели у которых есть связные поля другой модели[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version