在我的使用DRF的应用中,我想使用带有多个相关对象的模型序列化器。
models.py:
class JobType(models.Model):
name = models.CharField(null=False, max_length=250)
class Offer(models.Model):
user = models.ForeignKey(User, null=False)
job_type = models.ForeignKey(JobType, null=False)
salary = models.DecimalField(null=False, max_digits=8,
decimal_places=2)
serializers.py:
class JobTypeSerializer(serializers.ModelSerializer):
class Meta:
model = JobType
fields = ('id', 'name')
class OfferSerializer(serializers.ModelSerializer):
job_type = JobTypeSerializer()
class Meta:
model = Offer
fields = (
'salary', 'job_type', 'user'
)
views.py:
class SalaryViewSet(viewsets.ModelViewSet):
queryset = Salary.objects.all()
serializer_class = SalaryFullSerializer
我想要实现的目标: 当我在我的api / offer上做 GET请求时,我希望得到类似的内容:
[
{
"salary": 1000,
"user: 1,
"job_type": {
"id": 1,
"name": "Developer",
}
}
]
所以,基本上,当 GET提供时,我希望嵌套相关对象及其所有属性。
另一方面,当 POST提供时,我想限制JobType选项。
当我从OfferSerializer中删除job_type = JobTypeSerializer()
时,我有一个很好的下拉列表,有可用的选项(在DRF调试中)。但它导致GET on offer仅在结果中返回了JobOffer的ID。
我如何实现理想的行为?
答案 0 :(得分:1)
您可以为 POST 和 GET 请求使用不同的序列化程序。
覆盖get_serializer_class
def get_serializer_class(self):
if self.request.method == 'POST':
return SalaryPostSerializer
return SalaryFullSerializer