Как скрыть имя вложенного объекта в сериализаторе Django Rest Framework?
У меня есть две модели: Company и ContactCompany
МодельCompany является базовой моделью, а ContactCompany имеет некоторые специфические поля. Они связаны через внешний ключ.
Существуют два сериализатора CompanySerializer и ContactCompanySerializer.
Модели:
class Company(CoreModel):
name = models.CharField(
max_length=128,
verbose_name=_("Company Name"),
unique=True,
)
address = models.TextField(null=True, blank=True, verbose_name=_("Address"))
sector = models.ForeignKey(
"contact.Sector",
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_("Sector"),
related_name="companies",
)
city = models.ForeignKey(
City,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_("City"),
related_name="companies",
)
class ContactCompany(models.Model):
company = models.ForeignKey(
Company,
on_delete=models.CASCADE,
related_name="contact_companies",
null=True,
blank=True,
)
note = models.TextField(null=True, blank=True, verbose_name=_("Note"))
website = models.CharField(
null=True, blank=True, max_length=128, verbose_name=_("Website")
)
Сериализаторы:
class ContactCompanySerializer(serializers.ModelSerializer):
company = CompanySerializer()
integration_requirements = serializers.ListSerializer(
child=serializers.CharField(),
required=False,
)
statuses = StatusSerializer(many=True, read_only=True)
current_status = StatusSerializer(required=False)
contact_people = ContactPersonSerializer(many=True, read_only=True)
responsible_company = serializers.CharField(
source="responsible_company.name", read_only=True
)
class Meta:
model = ContactCompany
fields = (
"id",
"company",
"website",
"responsible_company",
"note",
"integration_requirements",
"current_status",
"statuses",
"contact_people",
)
class CompanySerializer(serializers.Serializer):
name = serializers.CharField()
is_active = serializers.BooleanField(required=False)
city = serializers.CharField(source="city.name", required=False, allow_null=True)
country = serializers.CharField(
source="city.country.name", required=False, allow_null=True
)
sector = serializers.CharField(
source="sector.name", required=False, allow_null=True
)
Пример json-ответа:
{
"id": 1,
"company": {
"name": "Company name",
"is_active": true,
"city": "City",
"country": "Country",
"sector": "Clothing"
},
"website": "test",
"note": "Note"
}
В json ответе я хочу удалить часть "company" и он должен быть таким:
{
"id": 1,
"name": "Company name",
"is_active": true,
"city": "City",
"country": "Country",
"sector": "Clothing"
"website": "test",
"note": "Note"
}
Я могу сделать это, напрямую добавив поля модели Company с помощью ключевого слова source в ContactCompanySerializer, но в проекте я буду использовать CompanySerializer, потому что будет больше типов компаний.