And*_*ewO 6 django django-rest-framework
不知道这是怎么回事。我正在尝试通过Django-rest-framework创建一个新实例。我究竟做错了什么?
提交了一些只读字段。我尝试通过read_only_fields序列化器将它们标记为只读,并editable=False在模型的字段中指定它们。
注意:如果可能,我宁愿避免指定自己的create方法。这应该通过此处记录的标准功能起作用
发布以下内容时:
{
"displayName": "New test",
"backgroundColour": "#4d3567",
"foregroundColour": "#FFFFFF",
"helpText": "test",
"description": "test",
"comment": "test."
}
Run Code Online (Sandbox Code Playgroud)
我越来越:
TypeError at /api/v1/classifications/
Got a `TypeError` when calling `ClassificationLabel.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `ClassificationLabel.objects.create()`. You may need to make the field read-only, or override the ClassificationLabelListSerializer.create() method to handle this correctly.
Run Code Online (Sandbox Code Playgroud)
models.py:
class ClassificationLabel(models.Model):
"""
this model is used to create all instances of classifications
labels that will be displayed to a user
"""
displayName = models.CharField('Classification label display name', max_length = 32)
helpText = models.TextField('Explanatory text about this label', max_length = 140, blank=True)
backgroundColour = models.CharField('Hex code for background colour including Alpha', max_length=8)
foregroundColour = models.CharField('Hex code for foreground colour include Alpha', max_length=8)
description = models.TextField('Description of this label', max_length = 256, blank=True)
comment = models.TextField('Internal comments for this label', max_length = 1024, blank=True)
lastChanged = models.DateTimeField('last changed timestamp', auto_now=True, editable=False)
identifier = models.CharField('Classification label ID', max_length = 128, blank=True, editable=False)
revision = models.PositiveIntegerField('Revision number for this label', default=1, editable=False)
#placeholder for lastChangedBy
def clean(self):
#the following code generates a unique identifier and checks it for collisions against existing identifiers
if not self.identifier:
stringCheck = False
while stringCheck is False:
newString = str(uuid.uuid4())
newString.replace('-', '')
doesStringExist = ClassificationLabel.objects.filter(identifier=newString).count()
if doesStringExist == 0:
stringCheck = True
self.identifier = newString
def __str__(self):
return self.displayName + " - " + self.identifier
def save(self, force_insert=False, force_update=False):
self.revision += 1
super(ClassificationLabel, self).save(force_insert, force_update) # Call the "real" save() method.
Run Code Online (Sandbox Code Playgroud)
序列化器:
class ClassificationLabelListSerializer(serializers.ModelSerializer):
class Meta:
model = ClassificationLabel
fields = ('displayName', 'helpText', 'identifier', 'backgroundColour', 'foregroundColour', 'comment', 'description', 'lastChanged', 'revision')
#read_only_fields = ('identifier', 'lastChanged', 'revision',)
Run Code Online (Sandbox Code Playgroud)
views.py
class ClassificationLabelList(mixins.ListModelMixin,generics.GenericAPIView, mixins.CreateModelMixin):
queryset = ClassificationLabel.objects.all()
serializer_class = ClassificationLabelListSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
似乎已解决 的问题更新的save()方法似乎已解决此问题。以下更新的代码:
def save(self, *args, **kwargs):
self.revision += 1
super(ClassificationLabel, self).save() # Call the "real" save() method.
Run Code Online (Sandbox Code Playgroud)
也许在你的序列化器中尝试这样的事情,
class ClassificationLabelListSerializer(serializers.ModelSerializer):
lastChanged = serializers.DateTimeField(read_only=True)
identifier = serializers.CharField(read_only=True)
revision = serializers.IntegerField(read_only=True)
class Meta:
model = ClassificationLabel
fields = ('displayName', 'helpText', 'identifier', 'backgroundColour', 'foregroundColour', 'comment', 'description', 'lastChanged', 'revision')
def create(self, validated_data):
return ClassificationLabel.objects.create(**validated_data)
Run Code Online (Sandbox Code Playgroud)
另外,编辑 models.py 中的保存方法,
def save(self, *args, **kwargs):
self.revision += 1
return super(ClassificationLabel, self).save(*args, **kwargs) #
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4688 次 |
| 最近记录: |