2

Django==1.5.5
djangorestframework==2.3.8

私は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)

このモデルに 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ため使用しているため、REST API では使用できません。Role.namedjango-dbgettext

編集: Role テーブルに id=1 の行が既に存在します。

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

ref: 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に感謝します。

于 2014-03-12T18:27:37.707 に答える
-1

外部キーは、存在する限りデフォルトを持つことができます。null=True を設定すると null を持つことができますが、外部キーは、それらが Roles テーブルの一致する ID 行である必要があることを意味します。

于 2013-11-01T14:32:01.720 に答える