【问题标题】:How to run "SELECT FOR UPDATE" instead of "SELECT" when adding data in Django Admin?在 Django Admin 中添加数据时如何运行 \"SELECT FOR UPDATE\" 而不是 \"SELECT\"?
【发布时间】:2022-12-17 09:51:00
【问题描述】:

PersonAdmin():中,我用select_for_update()覆盖了response_add(),这样就不会出现write skew,那么只能添加2个人添加人员并覆盖save_model()以便obj.save()仅在更改人员时有效换人如下所示:

# "store/admin.py"

from django.contrib import admin
from .models import Person

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

    def response_add(self, request, obj, post_url_continue=None):
                                                 # Here
        obj_count = super().get_queryset(request).select_for_update().all().count()
        
        if obj_count < 2:
            obj.save()

        return super().response_add(request, obj, post_url_continue)

    def save_model(self, request, obj, form, change):
        last_part_of_path = request.path.split('/')[-2]

        if last_part_of_path == "change":
            obj.save() # Here

但是,当添加一个人时添加人员如下所示:

SELECT 代替 SELECT FOR UPDATE 运行,如下所示。 *我用数据库下面的这些日志是PostgreSQL 的查询你可以查看On PostgreSQL, how to log queries with transaction queries such as "BEGIN" and "COMMIT"

那么,在添加人员时如何运行SELECT FOR UPDATE而不是SELECT添加人员

【问题讨论】:

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


    【解决方案1】:

    select_for_update() 不适用于 count()

                                             # Here                    # Here
    obj_count = super().get_queryset(request).select_for_update().all().count()
    

    但是,select_for_update()len() 一起工作,如下所示:

    # "store/admin.py"
    
    from django.contrib import admin
    from .models import Person
    
    @admin.register(Person)
    class PersonAdmin(admin.ModelAdmin):
    
        def response_add(self, request, obj, post_url_continue=None):
                        # Here                           # Here
            obj_count = len(super().get_queryset(request).select_for_update().all())
            
            if obj_count < 2:
                obj.save()
    
            return super().response_add(request, obj, post_url_continue)
    
        def save_model(self, request, obj, form, change): # Here
            last_part_of_path = request.path.split('/')[-2]
    
            if last_part_of_path == "change":
                obj.save() # Here
    

    所以,当添加一个人时添加人员如下所示:

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

    【讨论】:

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