我正在使用django 2.0.8和Python 3.5。我编写了一个基类,它将行为封装在基类中。
在子类中使用接口时,我发现我必须将子类的对象传递给父类 - 这不仅丑陋,而且容易出错。
我不想使用组合(而不是接口(,因为 django 模型中的 AFAIK 字段被保存到数据库中 - 除此之外,我更喜欢子类化方法,因为所有功能都可以保留在基类中。
有什么方法可以(在父类中(查找/获取调用方法调用的实例(或至少是类的名称及其 id(?
这是我的代码:
class Likeable(models.Model):
likes = GenericRelation(Like)
def action_is_permissible(self, actionable_object, actor):
ct = ContentType.objects.get_for_model(actionable_object)
object_id = actionable_object.id
found_objects = Like.objects.filter(content_type=ct, object_id=object_id, liker=actor)
return ((len(found_objects) == 0), ct, object_id, found_objects)
def add_like(self, actionable_object, actor):
can_add, ct, object_id, found_objects = self.action_is_permissible(actionable_object, actor)
if can_add:
like = self.likes.create(content_type=ct, object_id=object_id, liker=actor)
else:
# do nothing
return
class Meta:
abstract = True
class Foo(Likeable):
name = models.CharField(max_length=255,default='')
objects = models.Manager()
示例用法(省略导入(
foo = Foo.objects.get(id=1)
p = User.objects.get(id=1)
foo.add_like(foo, p) # <- nasty API calling convention
您可以使用self
访问它。self
是指正在调用的对象。
参考:自我的目的是什么?
编辑(代码更改(:
class Likeable(models.Model):
def add_like(self, actor):
# update `actionable_object` to `self`
foo.add_like(p)