繁体   English   中英

如何使用Django REST框架与外键的默认值模型?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM