首页 > 解决方案 > 使用 pk 以外的属性识别 Django Rest Framework ModelSerializer ForeignKey

问题描述

我觉得这是一个超级基本的问题,但在 DRF 文档中找不到答案。

假设我有这样的models.py设置:

#models.py
class Person(models.Model):
    name = models.CharField(max_length=20)
    address = models.CharField(max_length=20)

class House(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(Person)

我有一个 ModelSerializer 设置如下:

#serializers.py
class House(serializers.ModelSerializer):
    class Meta:
        model = House
        fields = '__all__'

我想要做的是能够POST新建 House 对象,但不必提供Person 对象的 pk,我希望能够提供Person 对象的名称

例如

post = {'name': 'Blue House', 'owner': 'Timothy'}

我使用的实际模型有几个 ForeignKey 字段,所以我想知道最规范的方法。

标签: djangodjango-rest-framework

解决方案


一种解决方案可能是使用SlugRelatedField

#serializers.py
class House(serializers.ModelSerializer):
    owner = serializers.SlugRelatedField(
        slug_field="name", queryset=Person.objects.all(),
    )
    class Meta:
        model = House
        fields = '__all__'

不过,这也会改变您的序列化程序的表示形式,因此在您渲染它时它会显示 Person 的名称。如果您需要呈现 Person 的主键,那么您可以覆盖 House 序列化to_representation()器方法,或者您可以通过继承 SlugRelatedField 并覆盖to_representation()它来实现一个小的自定义序列化器字段。


推荐阅读