為了添加資料 Django db,id 應該不同,所以我想更改資料模型的 id 值。如何從序列化程式更改模型 ID?
我制作了 data_server.py 和 data_client.py。使用這些管理/命令檔案夾
我檢查了 .save 命令后保存的序列化資料。當我輸入 Id 值時,我可以保存資料。但是當 id 值為 none 時,驗證測驗失敗并且 .save 會出錯
錯誤
Unexpected e=AssertionError('You cannot call `.save()` on a serializer with invalid data.'), type(e)=<class 'AssertionError'>
資料服務器.py
class MyTcpHandler(socketserver.BaseRequestHandler):
DBman = DBManager()
def handle(self):
print('[%s] connected' % self.client_address[0])
Name = self.registerdbname()
msg = self.request.recv(1024)
while msg:
print([Name], msg.decode())
stream = io.BytesIO(msg)
data = JSONParser().parse(stream)
serializer = DataSerializer(data=data) # create new instance
serializer = DataSerializer(data, data=data) # update 'data'
print(serializer)
print(Data.objects.last().id 1)
serializer.id = Data.objects.last().id 1
print(serializer)
serializer.is_valid()
serializer.errors
serializer.validated_data
try:
serializer.save()
print(f'data added : {serializer}')
if self.DBman.messageHandler(Name, msg.decode()) == -1:
self.request.close()
break
msg = self.request.recv(1024)
except Exception as e:
print(f"Unexpected {e=}, {type(e)=}")
break
print('[%s] connection terminated' % self.client_address[0])
self.DBman.removeClient(Name)
模型.py
class Data(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
temp = models.FloatField(default=0.0)
humidity = models.FloatField(default=0.0)
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return f'[{self.pk}]::{self.created_date}::{self.author}::{self.title}'
def get_absolute_url(self):
return f'/data/{self.pk}/'
class DataSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(write_only=False)
class Meta:
model = Data
fields = '__all__'
uj5u.com熱心網友回復:
如果你想把你的資料添加到資料庫中,你可以使用Data.objects.create(data=data)id自動遞增,你不需要自己更新它。
希望這能回答你的問題。
uj5u.com熱心網友回復:
讓我澄清一下我認為正在發生的事情,你可以告訴我這是否回答了錯誤的問題:)
- 您獲取資料,包括
id - 您想將此保存為新記錄,包括新 ID?
如果是這樣的話,那么一定要設定id到None做一個保存前,和Django會保存到資料庫中時,分配一個新的鍵值。沒有必要自己嘗試解決這個問題——只要確保那里沒有現有的。你很可能只是pop在id關閉串行完全為好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/384119.html
上一篇:如何在Django-Celery失敗的情況下設定重試任務
下一篇:Drfhowto:simple-jwtauthenticationwithouttheUSERNAME_FIELD
