Как исправить получение значения None при сериализации поля many to many в drf

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

Quote(models.Model):
    #...
    partner = models.ManyToManyField(
        Partner, blank=True, related_name='quote_partners')

и это модели партнеров в приложении для счетов

class Partner(models.Model):
    id = models.UUIDField(primary_key=True,
                          unique=True,
                          default=uuid.uuid4,
                          editable=False)
    name = models.CharField(max_length=100, blank=True, null=True)
    group = models.OneToOneField(
        Group, on_delete=models.DO_NOTHING, blank=True, null=True)

    def __str__(self):
        return self.name

А вот так выглядит сериализатор

class QuoteListSerializer(serializers.Serializer):
    """ For the List views """
    #...
    id = serializers.UUIDField(read_only=True)
    partner = serializers.CharField(read_only=True)

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

{           
            "id": "cbf64980-1637-4d0d-ad1f-4eb6421df5a1",
            "partner": "accounts.Partner.None", 
        },

Однако я вижу, что поле partners заполнено для этой конкретной записи на странице администратора, но не отображается в сериализованных данных. В модели партнеров

enter image description here

В цитате

[enter image description here][2

Кто-нибудь знает, почему это происходит и как исправить эту проблему.

Вы должны сделать также класс сериализатора класса Partner. В QuoteListSerializer вы вызываете этот сериализатор партнера. Сериализатор партнера будет вложен в json.

class QuoteSerializer(serializers.ModelSerializer):

    partner = PartnerSerializer(read_only=True)

    class Meta:
        model = Quote
        fields = __All__ you can exclude fields

Если у вас уже есть отдельные объекты связанных полей, и, как вы упомянули в комментариях, вам нужен UUID, который также является первичным ключом модели партнера, вы можете использовать PrimaryKeyRelatedField.

PrimaryKeyRelatedField может быть использовано для представления цели отношения отношения, используя его первичный ключ. Дополнительная информация

Модифицируйте свой QuoteListSerializer из

partner = serializers.CharField(read_only=True)

to

partner = serializers.PrimaryKeyRelatedField(read_only=True, many=True)

Это вернет набор UUID тех конкретных объектов, которые связаны с вашей Quote моделью.

"partner": [
                "115f1fa8-1cb2-4d49-962d-8c25e8b40240" # UUID of the linked partner
            ],

Если вы хотите вернуть строковое значение, то используйте StringRelatedField

StringRelatedField может использоваться для представления цели отношения используя его метод __str__. Дополнительная информация,

Это вернет name объектов-партнеров, так как вы установили это в модели партнера return self.name

Таким образом, вы можете получить следующий формат,

"partner": [
                "Company A" # name of the linked partner
            ],
Вернуться на верх