python - 如何将 Django REST 框架与具有外键默认值的模型一起使用?

标签 python django internationalization django-rest-framework

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

引用:django Rest framework doc

它可以工作,但看起来很重。

关于python - 如何将 Django REST 框架与具有外键默认值的模型一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19727625/

相关文章:

python - Python 字符串的最大长度是多少?

python - 矢量化 `signal.lfilter`

python - 装饰器是被装饰对象的属性?

python - 无法通过 Django 联系表单发送电子邮件

angularjs - 是否可以在运行时动态切换 AngularJS 的国际化语言?

javascript - 后备方法在带有 Rails 2.3 的 i18n-js 中不起作用

python - 为什么 zip 对象消失了?

javascript - 实时通知应用程序 DateTimeField 问题

python - “caching_sha2_password”插件在 Windows 上失败

java - 为什么没有加载我的 ResourceBundleControlProvider?