django - Django rest 框架序列化程序忽略 extra_kwargs 或自定义属性
问题描述
我正在尝试为客户端和主要用户制作一个略有不同的 api。所以如果角色是客户端,我想稍后添加客户端。
class StoreSerializer(serializers.ModelSerializer):
class Meta:
model = models.Store
fields = ["id", "name", "location", "location_lat", "location_lng", "client"]
def create(self, validated_data):
user = self.context["request"].user
if user.role == Roles.CLIENT.name:
validated_data["client"] = user.client
笨拙的模型看起来像这样
class Store(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE)
当我现在使用具有角色客户端的用户调用序列化程序时,我得到以下响应:
{"client":["This field is required."]}
哪个是对的。extra_kwargs
但是当我添加到 StoreSerializer时发生了奇怪的事情。如果我将序列化程序更改为:
class StoreSerializer(serializers.ModelSerializer):
class Meta:
model = models.Store
fields = ["id", "name", "location", "location_lat", "location_lng", "client"]
extra_kwargs = {
"client": { "required": False }
}
def create(self, validated_data):
user = self.context["request"].user
if user.role == Roles.CLIENT.name:
validated_data["client"] = user.client
或将其更改为
class StoreSerializer(serializers.ModelSerializer):
client = serializers.UUIDField(required=False)
class Meta:
model = models.Store
fields = ["id", "name", "location", "location_lat", "location_lng", "client"]
def create(self, validated_data):
user = self.context["request"].user
if user.role == Roles.CLIENT.name:
validated_data["client"] = user.client
我得到同样的回应。怎么会这样?客户端不应该是必需的吧?
版本:
- 姜戈:2.2.3
- Django 休息框架:3.9.4
解决方案
商店模型应该是这样的:(注blank
)
class Store(models.Model):
client = models.ForeignKey(Client, on_delete=models.CASCADE, blank=True)
现在在数据库级别上,您允许客户端在 Store 模型中为空。
这样的序列化器:
class StoreSerializer(serializers.ModelSerializer):
client = serializers.PrimaryKeyRelatedField(queryset=models.Client.objects.all(), required=False)
class Meta:
model = models.Store
fields = ["id", "name", "client"]
...
您的序列化程序现在应该可以工作了。
推荐阅读
- python - ValueError:尝试在python中添加两个多维数组时,无法将输入数组从形状(4,1)广播到形状(4)
- java - 改造相当于发布请求
- android - Flutter:迁移到 AndroidX 后无法生成发布 apk,相机插件出错
- python - 我在 seaborn 进口中面临这个问题:
- http-headers - openvpn http-proxy-option 标头,在服务器端做吗?
- c++ - 具有关联锁的对象或引用/指针的正确术语是什么?
- c# - 插入后 cosmos mongodb 属性中缺少属性
- qt - 保存单个字符
- bash - 检查 ip 是否存在于文件中并更新 iptables bash 脚本
- swift - Swift Realm 过滤所有具有空值的对象