Как получить доступ к полю внешнего ключа из другой модели в сериализаторе - PullRequest
1 голос
/ 08 ноября 2019

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

class Category(models.Model):
    name = models.CharField(max_length=256)

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name


class Contact(models.Model):
    first_name = models.CharField(max_length=256)
    last_name = models.CharField(max_length=256)
    address = models.CharField(max_length=1024)
    city = models.CharField(max_length=256)
    country = models.ForeignKey(Country, on_delete=models.CASCADE)
    email = models.EmailField(max_length=256, unique=True)
    phone = models.CharField(max_length=256)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    integration = models.ForeignKey(Integration, null=True, on_delete=models.SET_NULL)

    def __str__(self):
        return self.first_name


class Company(models.Model):
    name = models.CharField(max_length=256)
    address = models.CharField(max_length=256)
    city = models.CharField(max_length=256)
    country = models.ForeignKey(Country, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class ContactCompany(models.Model):
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE, related_name='job')
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='company')
    job = models.TextField(blank=True, help_text='Job', max_length=5000, null=True)
    started_at = models.DateTimeField(auto_now_add=True)
    finished_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.job

А вот мой сериализатор

class ContactSerializer(serializers.ModelSerializer):

    country_name = serializers.CharField(source='country.name')
    category_name = serializers.CharField(source='category.name')
    user_name = serializers.CharField(source='user.email')
    integration_name = serializers.CharField(source='integration.name')

    class Meta:
        model = Contact
        fields = ('first_name', 'last_name', 'address', 'city', 'country_name', 'email', 'phone',
                  'category_name', 'user_name', 'integration_name', 'job', )

Как получить доступ к полю компании из модели ContactCompany в этом сериализаторе?

Здеськак выглядит ответ API

{
            "first_name": "First name",
            "last_name": "Last name",
            "address": "Address",
            "city": "City",
            "country_name": "Gabon",
            "email": "saidsadiasida@gmam.com",
            "phone": "0712345678",
            "category_name": "TestCategory",
            "user_name": "ekartdragos@cyberaxo.com",
            "integration_name": "testmonth",
            "job": [
                4
            ]
        }

Как получить, чтобы текст задания отображался вместо идентификатора?

1 Ответ

0 голосов
/ 08 ноября 2019

Одним из возможных решений является использование serializerMethodField и получение информации о вашем желании.

class ContactSerializer(serializers.ModelSerializer):

    country_name = serializers.CharField(source='country.name')
    category_name = serializers.CharField(source='category.name')
    user_name = serializers.CharField(source='user.email')
    integration_name = serializers.CharField(source='integration.name')
    company = serializers.SerializerMethodField()

    class Meta:
        model = Contact
        fields = ('first_name', 'last_name', 'address', 'city', 'country_name', 'email', 'phone',
                  'category_name', 'user_name', 'integration_name', 'job', 'company' )
    def get_company(self, obj): 
    """
    at first we get the instance of ContactCompany from the id of object. then get the company information 
    """
        try:
            contact_company = ContactCompany.objects.get(contact=obj.id)
        expect ContactCompany.DoesNotExist: 
            # return or raise your desire this 

        return contact_company.company # here we have company id of this contact, also we can generate all company information from this. 


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...