调用 `WordsTable.objects.create()` 时出现 `TypeError`
Got a `TypeError` when calling `WordsTable.objects.create()`
我正在尝试使用序列化程序在数据库中保存一些数据。我已经创建了一个模型和一个序列化程序,但是当我尝试保存数据时出现此错误。看了很多答案,但一直没有想出解决办法。
我收到这个错误:Got a TypeError when calling WordsTable.objects.create(). This may be because you have a writable field on the serializer class that is not a valid argument to WordsTable.objects.create(). You may need to make the field read-only, or override the WordsTableSerializer.create() method to handle this correctly.
models.py:
class WordsTable(models.Model):
session_id = models.IntegerField(
db_column="session_ID", blank=True, null=True
) # Field name made lowercase.
user_id = models.IntegerField(
db_column="user_ID", blank=True, null=True
) # Field name made lowercase.
date = models.DateField(blank=True, null=True, default=datetime.date.today)
hour = models.TimeField(blank=True, null=True, default=datetime.date.today)
run_label = models.IntegerField(blank=True, null=True)
status = models.IntegerField(blank=True, null=True)
word1 = models.CharField(max_length=45, blank=True, null=True)
word2 = models.CharField(max_length=45, blank=True, null=True)
word3 = models.CharField(max_length=45, blank=True, null=True)
word4 = models.CharField(max_length=45, blank=True, null=True)
word5 = models.CharField(max_length=45, blank=True, null=True)
class Meta:
db_table = "words_table"
序列化器:
class WordsTableSerializer(serializers.ModelSerializer):
class Meta:
model = WordsTable
fields = "__all__"
Views.py:
#API
@api_view(["POST"])
def save_words(request):
if request.method == "POST":
saveserialize = WordsTableSerializer(data=request.data)
if saveserialize.is_valid():
saveserialize.save()
return Response(saveserialize.data, status=status.HTTP_201_CREATED)
return Response(saveserialize.data, status=status.HTTP_400_BAD_REQUEST)
我正在尝试的数据post:
{
"session_id" : 4567,
"word1" : "Pants",
"word2" : "Shock",
"word3" : "Cucumber"
}
我要补充什么?这是我第一次使用序列化程序,所以我有点困惑。谢谢!
您将 hour
声明为 models.TimeField
,但该字段的默认值是日期,这可能是原因。
如果你想存储小时的值,你可以尝试:
hour = models.IntegerField(blank=True, null=True, default=datetime.datetime.now().hour)
我正在尝试使用序列化程序在数据库中保存一些数据。我已经创建了一个模型和一个序列化程序,但是当我尝试保存数据时出现此错误。看了很多答案,但一直没有想出解决办法。
我收到这个错误:Got a TypeError when calling WordsTable.objects.create(). This may be because you have a writable field on the serializer class that is not a valid argument to WordsTable.objects.create(). You may need to make the field read-only, or override the WordsTableSerializer.create() method to handle this correctly.
models.py:
class WordsTable(models.Model):
session_id = models.IntegerField(
db_column="session_ID", blank=True, null=True
) # Field name made lowercase.
user_id = models.IntegerField(
db_column="user_ID", blank=True, null=True
) # Field name made lowercase.
date = models.DateField(blank=True, null=True, default=datetime.date.today)
hour = models.TimeField(blank=True, null=True, default=datetime.date.today)
run_label = models.IntegerField(blank=True, null=True)
status = models.IntegerField(blank=True, null=True)
word1 = models.CharField(max_length=45, blank=True, null=True)
word2 = models.CharField(max_length=45, blank=True, null=True)
word3 = models.CharField(max_length=45, blank=True, null=True)
word4 = models.CharField(max_length=45, blank=True, null=True)
word5 = models.CharField(max_length=45, blank=True, null=True)
class Meta:
db_table = "words_table"
序列化器:
class WordsTableSerializer(serializers.ModelSerializer):
class Meta:
model = WordsTable
fields = "__all__"
Views.py:
#API
@api_view(["POST"])
def save_words(request):
if request.method == "POST":
saveserialize = WordsTableSerializer(data=request.data)
if saveserialize.is_valid():
saveserialize.save()
return Response(saveserialize.data, status=status.HTTP_201_CREATED)
return Response(saveserialize.data, status=status.HTTP_400_BAD_REQUEST)
我正在尝试的数据post:
{
"session_id" : 4567,
"word1" : "Pants",
"word2" : "Shock",
"word3" : "Cucumber"
}
我要补充什么?这是我第一次使用序列化程序,所以我有点困惑。谢谢!
您将 hour
声明为 models.TimeField
,但该字段的默认值是日期,这可能是原因。
如果你想存储小时的值,你可以尝试:
hour = models.IntegerField(blank=True, null=True, default=datetime.datetime.now().hour)