Django 模型 - 接口设计,以避免需要在 PARENT 类中定义的 CHILD 类调用方法中传递对象



我正在使用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)

相关内容

最新更新