簡體   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