Получение связанных записей в сериализаторе - django

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

class ClientReadOnlySerializer(serializers.ModelSerializer):
    clientcontacts = ClientContactSerializer(many=True, read_only=True)
    class Meta:
        model  = Client
        fields = "__all__"

Есть ли способ сделать эти отношения вложенными?

это мои модели

clients model
# Relations
from apps.misc.models import City, TypeIdentity, TypeCLient, CIIU
from apps.clients.api.models.broker.index import Broker
from apps.authentication.models import User


class Client(models.Model):
    id              = models.CharField(max_length=255, unique=True,primary_key=True, editable=False)
    type_client     = models.ForeignKey(TypeCLient, on_delete=models.CASCADE, blank=True)
    type_identity   = models.ForeignKey(TypeIdentity, on_delete=models.CASCADE, blank=True)
    document_number = models.CharField(max_length=255, blank=True, unique=True)
    first_name      = models.CharField(max_length=255, blank=True, null=True)
    last_name       = models.CharField(max_length=255, blank=True, null=True)
    social_reason   = models.CharField(max_length=255, blank=True, null=True)
    city            = models.ForeignKey(City, on_delete=models.CASCADE, blank=True)
    address         = models.CharField(max_length=255, blank=True)
    email           = models.CharField(max_length=255, blank=True, unique=True)
    phone_number    = models.CharField(max_length=255, blank=True, unique=True)
    ciiu            = models.ForeignKey(CIIU, on_delete=models.CASCADE, blank=True)
    broker          = models.ForeignKey(Broker, on_delete=models.CASCADE, blank=True)
    user            = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
    income          = models.SmallIntegerField(blank=True, default=0)
    state           = models.BooleanField(default=True)
    created_at      = models.DateTimeField(auto_now_add=True)
    updated_at      = models.DateTimeField(null=True, default=None)

client contacts model

# Relations
from apps.clients.api.models.index import Client


class ClientContact(models.Model):
    id           = models.CharField(max_length=255, primary_key=True, unique=True, editable=False)
    client       = models.ForeignKey(Client, on_delete=models.CASCADE)
    first_name   = models.CharField(max_length=255)
    last_name    = models.CharField(max_length=255)
    phone_number = models.CharField(max_length=255)
    state        = models.BooleanField(default=True)
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(null=True, blank=True, default=None)

После некоторых исследований я пришел к решению, которое не кажется очень практичным. Я создал метод в сериализаторе, который запрашивает контакты клиента следующим образом

class ClientReadOnlySerializer(serializers.ModelSerializer):
    contacts = serializers.SerializerMethodField(method_name='get_contacts')
    class Meta:
        model  = Client
        fields = "__all__"
        extra_fields = ['contacts']

    
    def get_contacts(self, obj):
        contacts   = ClientContact.objects.filter(client=obj)
        serializer = ClientContactSerializer(contacts, many=True)
        return serializer.data

используя модель и сериализатор модели контакта я сделал запрос, который я добавил в дополнительное поле сериализатора клиента, если кто-то знает, как сделать этот процесс более оптимальным, пожалуйста, ответьте.

Вернуться на верх