我如何 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
实例,而不是只是它的名字。
为了避免混淆,我将 Day
的 pet_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
属性 设置唯一约束。
我正在开发宠物管理 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
实例,而不是只是它的名字。
为了避免混淆,我将 Day
的 pet_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
属性 设置唯一约束。