Django REST框架 - 如何在ModelSerializer中实现类似联合的字段

时间:2018-06-12 16:01:00

标签: python django django-rest-framework

我正在使用Django和Django REST Framework为项目构建RESTful API。

我有一个名为Pet抽象模型类。我还创建了几个从该基类继承的子类。除此之外,我还有一个继承自House的{​​{1}}模型,我正在使用models.Model模块中的User类。以下内容反映了我的django.auth

models.py

为了讨论起见,我们假设我的模型结构中的每个import models from django.contrib.auth.models import User class Pet(models.Model): pass class Dog(Pet): has_tail = BooleanField() name = CharField() ... class Cat(Pet): nails_trimmed = BooleanField() name = CharField() ... class House(models.Model): pet = models.ForeignKey(Pet) owner = models.ForeignKey(User) room_quantity = models.IntegerField() 都会有一个House。 (即不是可选的)

我想为每个经过身份验证的Pet提供创建User实例的功能。我想到的关键是我想让Pet创建成为一个隐含的过程。我希望用户能够创建一个House实例,并希望他们提供有关House Pet作为其请求的相关信息。我想以某种方式推断有关他们希望创建的Pet类型的信息,然后创建House的相关子类的实例。我不知道如何实现这一点。

我想创建一个Pet并添加"类型"字段,以推断要创建的PetSerializer(serializers.ModelSerializer)的类型。但是,由于将为要创建/更新的每种Pet提供不同的字段集,因此我不确定如何实现此Pet类。

从某种意义上说,我基本上希望在PerSerializer中有一个 union 类字段,并能够将其序列化/反序列化指向相关的{{ 1}}或HouseSerializer

我想过覆盖DogSerializer的{​​{1}}方法,以检查并验证特定于每个子类的属性。他们,我也可以覆盖CatSerializervalidate方法,以便创建/更新相关模型类的实例。但是,这需要我以明确的方式验证相关字段的存在。换句话说,我必须明确检查PetSerializer方法中每个继承类的每个属性是否存在。

这种做法并不像干嘛那样做。属性/字段已经存在于模型类中,并且必须在create类中显式验证从update继承的每个类的属性,这可能不是实现此功能的最佳方法。 / p>

我想知道是否有更好的Django / DRF方式来实现此功能。我想为从validate继承的每个类编写ModelSerializer类,但我不知道如何将序列化/反序列化逻辑从Pet类传递给PetSerializer }或Pet。关于如何设计/实现这个的任何建议?

0 个答案:

没有答案