Django - 使用models.py覆盖get_or_create

rh0*_*ium 2 django django-models

我有一个类,我想要覆盖该get_or_create方法.基本上如果我的班级没有存储我想要的答案,那么就会做一些过程来得到答案而且没有提供.该方法实际上是一种get_or_retrieve方法.所以这是课程:

class P4User(models.Model):
  user      = models.CharField(max_length=100, primary_key=True)
  fullname  = models.CharField(max_length=256)
  email     = models.EmailField()
  access    = models.DateField(auto_now_add=True)
  update    = models.DateField(auto_now_add=True)

  @classmethod
  def get_or_retrieve(self, username, auto_now_add=False):
    try:
        return self.get(user=username), False
    except self.model.DoesNotExist:
        import P4
        import datetime
        from django.db import connection, transaction, IntegrityError
        p4 = P4.P4().connect()
        kwargs = p4.run(("user", "-o", username))[0]
        p4.disconnect()
        params = dict( [(k.lower(),v) for k, v in kwargs.items()])        
        obj = self.model(**params)
        sid = transaction.savepoint()
        obj.save(force_insert=True)
        transaction.savepoint_commit(sid)
        return obj, True
    except IntegrityError, e:
        transaction.savepoint_rollback(sid)
        try:
            return self.get(**kwargs), False
        except self.model.DoesNotExist:
            raise e

  def __unicode__(self):
    return str(self.user) 
Run Code Online (Sandbox Code Playgroud)

现在我完全承认我已经使用db/models/query.py作为我的起点.我的问题是这一行.

obj = self.model(**params)

我能够获得参数,但我还没有定义self.model.我不明白它需要什么,并且直觉上不应该明白应该是什么价值.即使回头看查询.我也无法解决这个问题.谁可以给我解释一下这个?我真的很想理解它并修复我的代码.

谢谢

Dan*_*man 6

get_or_create是一种Manager方法,即通过model.objects访问它 - 它是具有属性的管理器类model.因此,最简单的方法是创建一个自定义管理器并将您的方法放在那里.

但是,现在修复代码很容易.self.model只是类名 - 该行只是用给定的参数实例化类.所以你可以做到

obj = P4User(**params)
Run Code Online (Sandbox Code Playgroud)

虽然如果你继承了模型,这会中断.