Django带有Postgresql更新对象,防止订单重新排序

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

在带有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=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这样的第三方软件不会执行删除和插入操作,而不是更新操作。