Задать вопрос
@snowsem
PHP/RUBY Разработчик

Не работает prefetch_related в django?

Есть 3 модели
from django.db import models

from django.utils import timezone

class Contact(models.Model):
    IDContact = models.IntegerField(primary_key=True)
    NameContact = models.CharField(max_length=255)
    FamilyContact = models.CharField(max_length=255)
    SoNameContact = models.CharField(max_length=255)
    class Meta:
        db_table = 'contacts'


class Client(models.Model):

    ClientId = models.IntegerField(primary_key=True)
    ClientName = models.CharField(max_length=255)
    contacts = models.ManyToManyField('Contact', through='Workplace')

    class Meta:
        db_table = 'clients'

class Workplace(models.Model):

    client = models.ForeignKey('Client', db_column='wpClientId')
    contact = models.ForeignKey('Contact', db_column='wpContactId')

    class Meta:
        db_table = 'Workplace'


# Create your models here.
class Post(models.Model):
    author = models.ForeignKey('auth.User')
    category = models.ForeignKey('PostCategory')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class PostCategory(models.Model):
    name = models.CharField(max_length=200)

    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)
    def __str__(self):
        return self.name

Пытаюсь вывести всех клиентов и их контакты(физ лица)
def post_list(request):
    clients = Client.objects.prefetch_related('contacts').all()
    return render(request, 'blog/post_list.html', {'clients': clients})

<html>
<body>
    {% for client in clients %}
        <div>
            <p><a href="">{{ client.ClientName }}</a></p>
        {% for contact in client.contacts.all %}
            {{ contact.NameContact }}
             {% endfor %}
        </div>

    {% endfor %}
</body>
</html>

Но выводит только клиентов. в Yii2 и Laravel решалось указанием связи в with() методе. в rails это includes(). Помогите))
Yii2 строит правильно через with 2 запроса и выводы на скринах. цифры после наименования это ids контактов которые связаны с контрагентом таблицей workplace.8cc368ec8f734f94b2411aab12613d46.png
91daf87b76784d109886f8f0af396622.png
  • Вопрос задан
  • 1184 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
{% for contact in client.contacts.all %}
Ответ написан
timofeydeys
@timofeydeys
Свобода творцов
def post_list(request):
    clients = Client.objects.prefetch_related('contacts').all()
    return render(request, 'blog/post_list.html', {'clients': clients})


Надо так))
def post_list(request):
    clients = Client.objects.all().prefetch_related('contacts')
    return render(request, 'blog/post_list.html', {'clients': clients})


А если ты хочешь вложенный запрос сделать, по определенному queryset, тогда так:

from django.db.models import Prefetch

def post_list(request):
    clients = Client.objects.all().prefetch_related(Prefetch('contacts', queryset=Contanct.objects.all()))  # В Queryset скармливаешь просто queryset и делается вложенный запрос.
    return render(request, 'blog/post_list.html', {'clients': clients})
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы