我有以下抽象类:
not correct
我有一个继承自User的自定义用户。
class UserStamp(models.Model):
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True,
related_name='%(app_label)s_%(class)s_created_by', on_delete=models.CASCADE)
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True,
related_name='%(app_label)s_%(class)s_updated_by', on_delete=models.CASCADE)
class Meta:
abstract = True
用户可以自己或其他用户创建/更新。
当用户创建/更新自己时,我没有为created_by,update_by提供任何内容。
可以使用Django Admin或Django Admin外部创建用户;
在Django Admin中,用户可以由工作人员创建,Django以外是自创的;
还有在终端中创建的超级用户;
关于更新,Django Admin和外部的用户都可以自我更新或由其他用户自行更新。
我想过使用post_save或自定义信号。问题是request.user在模型中不可用,但在View中,控制View in Admin和终端(超级用户)是一个瓶颈。
也许在保存传递实例后尝试进行查询,但我并不完全知道如何将所有信号/查询组合在一起,请检查超级用户。
答案 0 :(得分:1)
创建自己的custom signals
。
from django.dispatch import Signal
# you can pass any number of arguments as per your requirement.
manage_user = Signal(providing_args=["user", "is_updated"])
def user_handler(sender, **kwargs):
# `user` who created/updated object i.e `request.user`
user = kwargs['user']
# `is_updated` will be `False` if user object created.
is_updated = kwargs['is_updated']
# `sender` is the user object which is created/updated.
...
# do your stuff
manage_user.connect(user_handler)
覆盖自定义用户类的save()
方法。
from .signals import manage_user
class User(...):
...
# call this save method like obj.save(created_by=request.user)
def save(self, created_by, *args, **kwargs):
super().save(*args, **kwargs)
# is_updated will be True if user object is updated
manage_user.send(sender=self, user=created_by, is_updated=True if self.id else False)
当用户模型发生变化时,发送
manage_user
信号,就像post_save
信号一样, 但现在你可以控制参数了。
如果您使用django admin创建用户,则可以覆盖save_model,那里有请求对象。
from django.contrib import admin
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
super(UserAdmin, self).save_model(request, obj, form, change)
manage_user.send(sender=self, user=request.user, is_updated=True if self.id else False)