Django Serializer - объединение полей из двух моделей

У меня есть две модели, а именно:

class B (models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=255)

class A (models.Model):
    id = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=255)
    b = models.ForeignKey(B,on_delete=models.CASCADE,null=True) 

Мне нужен сериализатор, который возвращает ответ, подобный этому:

{
   "id": 1,
   "name": "test",
   "b_id": 2,
   "b_name": "test
}

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

    {
       "id": 1,
       "name": "test",
       "b":{
           "id":"test",
           "name": "test"
            }
    }

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

serializers.py

class Bserializer(serializers.ModelSerializer):
      class Meta:
         model = B
         fields = "__all__" #or only the fields you want

class Aserializer(serializers.ModelSerializer):
       b = Bserializer()
       class Meta:
         model = B
         fields = ["id","name", "b"]

Поскольку поле b в модели A является отношением один ко многим, поэтому оно должно быть списком элементов, подобным этому, также проверьте docs

{
   "b_id": 1,
   "b_name": "test",
   "a": [
       'a_id1': 'a_name',
       'a_id2': 'a_name'
   ]
}

Если это то, что вы хотите, вы можете сделать это следующим образом:

class BSerializer(serializers.ModelSerializer):
    a = serializers.StringRelatedField(many=True)

    class Meta:
        model = Album
        fields = ['id', 'name', 'a']

Это непосредственно из проекта, над которым я сейчас работаю

class CoachLocationsSerializer(serializers.ModelSerializer):

    base = LocationSerializer(read_only=True)
    locations = LocationSerializer(read_only=True, many=True)

    class Meta:
        model = Coach
        fields = ['base', 'locations']

Вы можете добиться этого без использования вложенных сериализаторов, вот так:

class ASerializer(serializers.ModelSerializer):
    b_name = serializers.CharField(source='b__name')

    class Meta:
        model = A
        fields = ('id', 'name', 'b_id', 'b_name')

Также обратите внимание, что вам не нужно объявлять b_id в сериализаторе, поскольку это уже поле модели

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