這是我的模型:
class Log(models.Model):
user = models.OneToOneField(UserProfile, verbose_name='user', on_delete=models.CASCADE)
log = models.JSONField(verbose_name='log', default=list, null=True, blank=True)
def __str__(self):
return self.user.username
像這樣的資料(log.log):
[
{"date": "2021-1-1", "volume": 123},
{"date": "2021-2-1", "volume": 456}, // if post date is 2021-2-1, i want delete this
{"date": "2021-3-1", "volume": 789}
]
這個這個洗掉視圖:
def delete(self, request, *args, **kwargs):
date = request.data.get('date', None)
if not date:
return Response(status=status.HTTP_400_BAD_REQUEST)
user = request.user
log = Log.objects.filter(user=user).first()
if not log:
return Response(status=status.HTTP_404_NOT_FOUND)
# delete data based on date
# data = json.dumps(log.log)
...
return Response(status=status.HTTP_200_OK)
我不擅長json,嘗試了幾種方法但失敗了。
非常感謝任何答案
uj5u.com熱心網友回復:
def delete(self, request, *args, **kwargs):
date = request.data.get('date', None)
if not date:
return Response(status=status.HTTP_400_BAD_REQUEST)
user = request.user
log = Log.objects.filter(user=user).first()
if not log:
return Response(status=status.HTTP_404_NOT_FOUND)
log.log = [
item for item in log.log
if item['date'] != date
]
log.save()
return Response(status=status.HTTP_200_OK)
但是,如果資料是結構化的,就像您的 JSON 資料中的情況一樣,那么在關系資料庫中使用額外的模型會更好,因此:
class LogEntry(models.Model):
log = models.ForeignKey(Log, on_delete=models.CASCADE)
date = models.DateField()
volume = models.IntegerField()
其實那種情況下log是沒有意義的,可以UserProfile直接參考。date這將使對資料庫的更新更有效,而且資料庫可以驗證資料,例如通過防止您在欄位中存盤不是日期的內容。
如果使用 JSON blob,我們將完全反序列化 blob,洗掉條目,然后再次序列化結果。因此,這在整個blob 的大小上是線性縮放的,而不是在要洗掉的記錄的大小上。
注意:通常使用[Django-doc]參考用戶模型比直接使用模型 [Django-doc]更好。有關更多資訊,您可以查看檔案的參考模型部分。
settings.AUTH_USER_MODELUserUser
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442681.html
