我如何 post 其他字段的外键而不是 django rest 框架中的主键

how do I post a foreign key by some other field rather than primary key in django rest framework

我正在开发宠物管理 api,这就是我 post 到 body 将星期几分配给宠物时的内容 :

{
   "day": "Sunday",
   "pet_name": 2 <-- how to add pet name (rather than the primary key)(this is a foreign key)
}

如何传入外键字段而不是主键字段的昵称。

如果只是想显示一些只读数据,可以使用SerializerMethodField:

from django.core.exceptions import ObjectDoesNotExist

class DaySerializer(serializers.ModelSerializer):
    pet_name = serializers.SerializerMethodField()

    def get_pet_name(self, obj):
        try:
            return obj.pet_name.name
        except ObjectDoesNotExist:
            # the day object doesn't have any
            # pet associated, so return None
            return None

注意: 如果您将 pet_name 外键更改为 pet 会更好,因为它持有一个 Pet 实例,而不是只是它的名字。

为了避免混淆,我将 Daypet_name 属性 重命名为 pet,因为它引用了 Pet 模型。

class Day(models.Model):
    pet = models.ForeignKey(Pet, on_delete=models.CASCADE, null=True)

在你的 DaySerializer 中你可以只使用 SlugRelatedField 来使用宠物的 name 来引用宠物。

class DaySerializer(serializers.ModelSerializer):
    pet_props = PropsSerializer(read_only=True, many=True)
    pet = serializers.SlugRelatedField(slug_field='name')

    class Meta:
        model = models.Day
        fields = ("id", "day", "pet", "pet_props")

此序列化程序的表示会将宠物的 name 作为 pet 字段的值。同样在写作时,这允许您使用宠物的 name 来引用解决您问题中实际问题的 pet 实例。

(技术上你也可以做 pet_name = serializers.SlugRelatedField(slug_field='name'),但我不会那样做以避免混淆。)

不过,我建议对您宠物的 name 属性 设置唯一约束。