Django带有Postgresql更新对象,防止订单重新排序
在带有postgreSQL的django生产模式中,当我从数据库中获得一个仍然存在的对象/行时,编辑/更新它并将其存储回数据库,该行被移动到表的末尾Django带有Postgresql更新对象,防止订单重新排序,django,postgresql,Django,Postgresql,在带有postgreSQL的django生产模式中,当我从数据库中获得一个仍然存在的对象/行时,编辑/更新它并将其存储回数据库,该行被移动到表的末尾 对象1 对象2 对象3 编辑完对象1后 对象2 对象3 对象1 型号.py class itemModels(models.Model): name = models.CharField(max_length=50) photo = models.ImageField(max_length=200, blank=Tru
- 对象1
- 对象2
- 对象3
- 对象2
- 对象3
- 对象1
class itemModels(models.Model):
name = models.CharField(max_length=50)
photo = models.ImageField(max_length=200, blank=True, default="default.png")
photo2 = models.ImageField(max_length=200, blank=True, default="default2.png")
price = models.DecimalField(max_digits=6, decimal_places=2)
sku = models.CharField(max_length=50, unique=True)
description = models.CharField(max_length=255)
def __self__(self):
return self.name
class itemViewSet(viewsets.ModelViewSet):
queryset = itemModels.objects.all()
serializer = itemSerializers()
renderer_classes = [TemplateHTMLRenderer]
template_name = 'product-list.html'
lookup_field = 'pk'
# list all item
def list(self, request):
queryset = itemModels.objects.all()
context = {'posts': queryset}
return Response(context)
# serializer form
def serializer_list(self, request):
serializer = itemSerializers()
return Response({'serializer': serializer}, template_name='product-create.html')
def retrieve(self, request, pk):
profile = get_object_or_404(itemModels, pk=pk)
serializer = itemSerializers(profile)
return Response({'serializer': serializer}, template_name='product-edit.html')
def update(self, request, pk):
profile = get_object_or_404(itemModels, pk=pk)
serializer = itemSerializers(profile, data=request.data)
if serializer.is_valid():
serializer.save()
print('status: status.Item Update')
return redirect('item')
else:
print('status: status.Item Bad Update')
视图.py
class itemModels(models.Model):
name = models.CharField(max_length=50)
photo = models.ImageField(max_length=200, blank=True, default="default.png")
photo2 = models.ImageField(max_length=200, blank=True, default="default2.png")
price = models.DecimalField(max_digits=6, decimal_places=2)
sku = models.CharField(max_length=50, unique=True)
description = models.CharField(max_length=255)
def __self__(self):
return self.name
class itemViewSet(viewsets.ModelViewSet):
queryset = itemModels.objects.all()
serializer = itemSerializers()
renderer_classes = [TemplateHTMLRenderer]
template_name = 'product-list.html'
lookup_field = 'pk'
# list all item
def list(self, request):
queryset = itemModels.objects.all()
context = {'posts': queryset}
return Response(context)
# serializer form
def serializer_list(self, request):
serializer = itemSerializers()
return Response({'serializer': serializer}, template_name='product-create.html')
def retrieve(self, request, pk):
profile = get_object_or_404(itemModels, pk=pk)
serializer = itemSerializers(profile)
return Response({'serializer': serializer}, template_name='product-edit.html')
def update(self, request, pk):
profile = get_object_or_404(itemModels, pk=pk)
serializer = itemSerializers(profile, data=request.data)
if serializer.is_valid():
serializer.save()
print('status: status.Item Update')
return redirect('item')
else:
print('status: status.Item Bad Update')
我想防止这种重新订购的情况发生,我是否遗漏了什么?谢谢各位
注:
如果我使用开发模式并切换到django dummie数据库,这种情况就不会发生
def list(self, request):
queryset = itemModels.objects.all()
context = {'posts': queryset}
return Response(context)
到
感谢@snakecharmerb为您的查询指定一个明确的顺序可能比依赖表中的行顺序要好。@snakecharmerb您的意思是,我需要发布我的postgrasql数据库行吗?不,我的意思是您执行以下查询:
queryset=itemModels.objects.order_by('name')。all()
。也就是说,如果希望对象按特定顺序排列,请使用order\u by
指定顺序。数据库可以随心所欲地对其表进行排序,而且您无法保证像serialiser这样的第三方软件不会执行删除和插入操作,而不是更新操作。