【问题标题】:User history actions - The proper way to store in django models用户历史操作 - 存储在 django 模型中的正确方法
【发布时间】:2014-05-26 20:55:01
【问题描述】:

我的用户是雇主,他们可以执行诸如向候选人发送消息、与他人分享简历以及撰写关于候选人的评论等操作。

为此,我创建了 3 个单独的模型,每个动作一个:

class Share(models.Model):
    user          = models.ForeignKey(BatitoUser, related_name="shares")
    shared_user   = models.ForeignKey(BatitoUser, blank=True)
    to_email      = models.EmailField()
    message       = models.TextField(blank=True)
    date          = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s - %s' % (self.user, self.to_email)

class Review(models.Model):
   user    = models.ForeignKey(BatitoUser)
   to_user = models.ForeignKey(BatitoUser, related_name='reviews')
   review  = models.TextField(blank=True)
   rating  = models.DecimalField(max_digits=2, decimal_places=1, blank=True)
   date    = models.DateField(auto_now=True)

   def __unicode__(self):
        return '%s - %s' % (self.user, self.to_user)**

class MessageSent(models.Model):
     user    = models.ForeignKey(BatitoUser, related_name="messages")
     to_user = models.ForeignKey(BatitoUser)
     message = models.TextField()
     date = models.DateTimeField(auto_now_add=True)

     def __unicode__(self):
         return '%s - %s' % (self.user, self.to_user)

我希望能够列出所有雇主的历史行为。 最好的方法是什么?

我在考虑 2 个选项:

  1. 从每个模型中检索相关信息到模板中(user.reviews_set.all、user.share_set.all 等...),然后通过 jquery/javascript 按日期对它们进行排序。

  2. 创建另一个包含所有用户操作的历史模型。但我不知道该怎么做......

我会很感激任何建议。

【问题讨论】:

    标签: django django-models models


    【解决方案1】:

    您可以从 django 的管理日志from django.contrib.admin.models import LogEntry 中获得灵感,或者在符合您的要求时使用它。 Checkout this

    【讨论】:

    • 所以你基本上是说我应该保留上面的模型,然后添加另一个类似于 LogEntry 模型的历史模型,对吧?
    • 是的,确保你的 installed_apps 中有 django.admin
    • 很高兴为您提供帮助。
    【解决方案2】:

    只是一个快速而肮脏的想法:你所有的模型都有很多共同点。您可以子类化一个基本模型(消息)并通过 models.Message.objects.all() 检索简单的历史记录(即不将消息与分享和评论分开)

    class Message(models.Model):
        user          = models.ForeignKey(BatitoUser)
        to_user       = models.ForeignKey(BatitoUser, blank=True)
        message       = models.TextField(blank=True)
        date          = models.DateTimeField(auto_now_add=True)
    
         def __unicode__(self):
             return '%s - %s' % (self.user, self.to_user)
    
    class Share(Action):
        to_email      = models.EmailField()
    
        def __unicode__(self):
            return '%s - %s' % (self.user, self.to_email)
    
    class Review(models.Model):
       rating  = models.DecimalField(max_digits=2, decimal_places=1, blank=True)
    

    历史中是否有同样快速而肮脏的方法来按类型分隔消息

    【讨论】:

    • 您好,感谢您的回复。我实际上使用其他模型来存储没有消息字段的用户之间的历史操作(呼叫、采访......)。那么创建一个只有 user、to_user 字段的基础模型有意义吗?此外,也许向基本模型添加“类型”字段将有助于区分历史操作?
    • 一段时间后,我认为这不是一个好主意。然而,仍然可以从一个基本模型继承所有内容,使用它来实现历史将是一大难题。正如@Mounir 建议的那样,LogEntry 和在 post_save 信号中创建会更加干净和直接
    猜你喜欢
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2012-08-22
    相关资源
    最近更新 更多