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 в сериализаторе, поскольку это уже поле модели