[英]Use uuid as foreign Key in a model in Django with Django Rest Framework
[英]How to use Django REST framework with a model with default value for foreign key?
Django的== 1.5.5
djangorestframework == 2.3.8
我有一个带外键的模型:
class Role(models.Model):
name = models.CharField("Name", unique=True)
def __unicode__(self):
return unicode(_(self.name))
class Worker(models.Model):
name = models.CharField("Name")
role = models.ForeignKey(Role, default=1)
我在这个模型中添加了一个REST api:
class WorkerSerializer(serializers.ModelSerializer):
role = serializers.PrimaryKeyRelatedField(required=False, read_only=False)
class Meta:
model = Worker
class WorkerAPIList(generics.ListCreateAPIView):
model = Worker
serializer_class = WorkerSerializer
当我使用没有赋予角色的POST请求创建新工作程序时,它无法在模型中选择默认值并返回错误:
ValueError: Cannot assign None: "Worker.role" does not allow null values.
任何帮助,将不胜感激。
谢谢
注意:我使用PrimaryKeyRelatedField
因为Role.name
字段由django-dbgettext
翻译,所以我不能在REST API中使用它。
编辑:角色表中id = 1的行已存在。
我找到了一个解决方案:向序列化器添加字段级验证:
class WorkerSerializer(serializers.ModelSerializer):
...
def validate_role(self, attrs, source):
"Set a default role if needed."
value = attrs[source]
if value is None:
attrs[source] = Role.objects.get(id=Worker.role.field.default)
return attrs
ref: django Rest框架doc
它有效,但看起来很重。
没有默认值是一个设计决策。 请查看以下问题以获取更多详细信息,他们还提到了如何通过覆盖字段类来自己正确设置默认值,这似乎比覆盖序列化程序更清晰。
https://github.com/tomchristie/django-rest-framework/issues/988
它开箱即用,更新2.3.13。 检查更改日志 。
感谢Anton-Shutik的Pull Request!
只要存在,您的外键就可以有默认值。 如果设置null = True,则它可以为null,但外键表示它们应该是Roles表中的匹配ID行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.