![](/img/trans.png)
[英]Use uuid as foreign Key in a model in Django with Django Rest Framework
[英]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.