Как исправить получение значения 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 заполнено для этой конкретной записи на странице администратора, но не отображается в сериализованных данных. В модели партнеров
В цитате
[
][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
],
