Django Rest Framework - 相关字段作为GET的嵌套对象,仅用于POST的pk

时间:2016-05-06 14:24:14

标签: python django django-models django-rest-framework

在我的使用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。

我如何实现理想的行为?

1 个答案:

答案 0 :(得分:1)

您可以为 POST GET 请求使用不同的序列化程序。 覆盖get_serializer_class

def get_serializer_class(self):
    if self.request.method == 'POST':
        return SalaryPostSerializer
    return SalaryFullSerializer