Запись действий пользователя в django?
У меня есть проект, в котором некоторые пользователи могут выполнять действия CRUD. Я хочу записывать, кто, что и когда сделал. В настоящее время я думаю о создании модели
class UserAction(models.Model):
user_id = models.CharField(max_length=100)
action_flag = models.CharField(max_length=100)
class_id = models.CharField(max_length=100)
action_taken_at = models.DateTimeField(default=datetime.now())
и сделать функцию, которая заполняет мою таблицу UserAction. Есть ли лучший способ сделать это?
app/models.py:
from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
class Action(models.Model):
sender = models.ForeignKey(User,related_name='user',on_delete=models.CASCADE)
verb = models.CharField(max_length=255)
target_ct = models.ForeignKey(ContentType, blank=True, null=True,
related_name='target_obj', on_delete=models.CASCADE)
target_id = models.PositiveIntegerField(null=True, blank=True)
target = GenericForeignKey('target_ct', 'target_id')
created = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('-created',)
def __str__(self):
return self.pk
app/admin.py
from .models import Action
admin.site.register(Action)
Как вы можете его использовать?
Теперь вы можете импортировать эти модели (Action) в любой из ваших views.py.
Например, если у вас есть пост и он понравился пользователю, вы можете просто написать
Action.objects.create(sender=request.user,verb="likes this post",target=post)
и теперь, когда вы посмотрите на свою админку, вы увидите, что tartget_id=post.pk Здесь я предполагаю, что пользователь аутентифицирован, и вы можете изменить это на свое усмотрение. Удачного кодинга!!!
Вы можете сделать это, создав модель в
Models.py
class Auditable(models.Model):
ip = models.GenericIPAddressField(null=True)
user_agent = models.CharField(max_length=255, blank=True)
remote_host = models.CharField(max_length=255, blank=True)
created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="%(app_label)s_%(class)s_created_by", null=True, blank=True) # this is for web user
modified_at = models.DateTimeField(auto_now=True, blank=True, null=True)
modified_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="%(app_label)s_%(class)s_modified_by", null=True, blank=True) # this is for web user
class Meta:
abstract = True
def get_fields(self):
list_fields = ['ip', 'user_agent',
'remote_host', 'created_by', 'modified_by']
return [(field.verbose_name, field._get_val_from_obj(self)) for field in self.__class__._meta.fields if field.name not in list_fields and not
(field.get_internal_type() == "DateTimeField" and
(field.auto_now is True or field.auto_now_add is True)) and
field.concrete and (not field.is_relation or field.one_to_one or
(field.many_to_one and field.related_model))]
Вы можете дать любое имя класса (я дал auditable). Поэтому все, что вам нужно сделать, это передать этот класс (auditable) в каждой вашей модели вместо models.Model
Например:
class Student(Auditable):
Сделав это, вы добавите все записи проверяемых полей в каждую созданную вами таблицу. Надеюсь, вы сможете получить ответ, сделав это.