2

Django==1.5.5
djangorestframework==2.3.8

I have a model with a Foreignkey:

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)

I add a REST api to this model:

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

When I create an new worker with a POST request with no role given, it can't pick the default value in the model and return an error:

ValueError: Cannot assign None: "Worker.role" does not allow null values.

Any help would be appreciated.
Thanks

NB: I use PrimaryKeyRelatedField because Role.name field is translated by django-dbgettext, so I can't use it in REST API.

Edit: a row with id=1 in Role table already exists.

4

4 回答 4

4

我找到了一个解决方案:向序列化程序添加字段级验证:

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 框架文档

它有效,但似乎很重。

于 2013-11-01T16:08:07.680 回答
1

没有默认值是一个设计决定。请检查以下问题以获取更多详细信息,他们还提到如何通过覆盖字段类自己正确设置默认值,这似乎比覆盖序列化程序更清晰。

https://github.com/tomchristie/django-rest-framework/issues/988

于 2013-11-01T19:16:47.087 回答
0

它适用于更新 2.3.13。检查更改日志

感谢Anton-Shutik的 Pull Request !

于 2014-03-12T18:27:37.707 回答
-1

只要存在,您的外键就可以具有默认值。如果您设置 null=True,它可以为 null,但外键意味着它们应该是 Roles 表中匹配的 ID 行。

于 2013-11-01T14:32:01.720 回答