【问题标题】:How to run "SELECT FOR UPDATE" instead of "SELECT" when changing and deleting data in Django Admin?在 Django Admin 中更改和删除数据时如何运行 \"SELECT FOR UPDATE\" 而不是 \"SELECT\"?
【发布时间】:2022-12-15 14:08:31
【问题描述】:

我有以下代码:

# "store/models.py"

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
# "store/admin.py"

from django.contrib import admin
from .models import Person

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    pass

然后,当更改数据时如下所示:

SELECT 代替 SELECT FOR UPDATE 运行,如下所示:

而且,当点击Delete按钮换人如下所示:

然后点击Yes, I'm sure按钮删除数据如下图:

SELECT 代替 SELECT FOR UPDATE 运行,如下所示:

现在,如上所示,我想为这两种情况运行 SELECT FOR UPDATE 而不是 SELECT

那么,我该怎么做呢?

【问题讨论】:

    标签: python python-3.x django django-admin select-for-update


    【解决方案1】:

    您需要使用 select_for_update() 覆盖 get_queryset() ,如下所示:

    # "store/admin.py"
    
    from django.contrib import admin
    from .models import Person
    
    @admin.register(Person)
    class PersonAdmin(admin.ModelAdmin):
        def get_queryset(self, request):
            qs = super().get_queryset(request)
            
            last_part_of_referer = request.META.get('HTTP_REFERER').split('/')[-2]
            last_part_of_uri = request.build_absolute_uri().split('/')[-2]
    
            if (last_part_of_referer == "change" and last_part_of_uri == "change") or 
               (last_part_of_referer == "delete" and last_part_of_uri == "delete"):
                qs = qs.select_for_update()
            
            return qs
    

    然后,当更改数据时如下所示:

    SELECT FOR UPDATE 代替 SELECT 运行,如下所示:

    而且,当点击Delete按钮换人如下所示:

    然后点击Yes, I'm sure按钮删除数据如下图:

    SELECT FOR UPDATE 代替 SELECT 运行,如下所示:

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2020-07-15
      • 2012-06-11
      相关资源
      最近更新 更多