Запрос фильтра Django по внешнему ключу - PullRequest
0 голосов
/ 27 февраля 2019

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

from django.db import models

class Pictures(models.Model):
    name = models.CharField(max_length=100)
    bild = models.FileField(upload_to='article_pictures/')
    articel = models.ForeignKey('articles', on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Articles(models.Model):
    name = models.CharField(max_length=100)
    text = models.TextField(max_length=2000)
    published = models.BooleanField(default=False)

    def __str__(self):
        return self.name

как получить опубликованные артикулы из класса артикулов, включая изображения (если они есть, или больше)?

Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Все опубликованные статьи:

Articles.objects.filter(published=True)

Одна опубликованная статья (пример):

article = Articles.objects.filter(published=True).first()
# and it's pictures
for picture in article.pictures_set.all():
    print(picture)
0 голосов
/ 27 февраля 2019

Примечание : модели имеют единичные имена, поэтому вам следует переименовать Articles в Article и Pictures в Picture.

Связанные Picture статьи article могут быть получены с помощью:

my_article.<b>picture_set.all()</b>

это набор запросов, содержащий все связанные изображения.

Мы можем получитьArticle s, которые публикуются, а затем извлекают связанные Picture s в двух дополнительных запросах с помощью:

articles = Article.objects.filter(<b>published=True</b>).<b>prefetch_related('picture_set')</b>

Таким образом, в шаблоне вы можете отобразить его следующим образом:

{% for article in articles %}
    {{ article.name }}
    {% for picture in article.picture_set.all %}
        {{ picture.name }}
    {% endfor %}
{% endfor %}
0 голосов
/ 27 февраля 2019

Я не думаю, что есть какой-то точный запрос для этого, но вы можете использовать prefetch_related для предварительной загрузки данных из базы данных.Например:

articles = Artikles.objects.filter(published=True).prefetch_related('pictures_set')

for article in articles:
     article.pictures_set.all()  # will not hit database

...