构建Django-App以将自定义业务规则附加到对象实例

时间:2010-11-22 20:46:01

标签: python django-models

我已经破解了如何构建我的代码以适应特定模型的实例特定的业务规则。

例如。假设我有一个带有类型字段和choices=(('I','Individual'),('C','Company))的联系人模型。根据我的模型类型,我可能想要自定义方法。

所以大声思考,这样的事情会很好:

class IndividualContact(Contact):
""" A custom class used for Contact instances with type='I' """
    criteria = Q(type='I')

# The goal here is that Contact is now aware of IndividualContact and constructs
# objects accordingly.
Contact.register(IndividualContact)

甚至:

class SpecialContact(Contact):
""" A custom class used for the contact with pk=1 """
    criteria = Q(pk=1)

此时我有一个很好的家,我的特殊实例特定代码。

我探索的一个替代方案是使用模型继承并避免类似字段传递新行为等内容。这样,新类可以优雅地插入到现有框架中,并且您可以很好地设置为自己的不同类型添加自定义字段,以备不时之需。

在我的情况下,我在网站上有一个资源信用系统,允许我说“你可能只有2个房源和20张照片”。个别资源类型是配额,但有一个通用的信用表,为您提供各种内容类型的信用。计算清单和照片的逻辑因您正在使用的对象类型而异。

即:

listing_credit = Credit.objects.create(content_type=ContentType.objects.get_for_model(Listing), user=user, credit_amt=2)

# Should subtract **active** listings from current sum total of Listing credits.
listing_credit.credits_remaining()

photo_credit = Credit.objects.create(content_type=ContentType.objects.get_for_model(Photo), user=user, credit_amt=5)

# Photos have no concept of an active status, so we just subtract all photos from the current sum total of Listing credits. 
# Also, the Photo might be associated to it's user through a 'created_by' field whereas
# Listing has a user field.  
photo_credit.credits_remaining()

我目前的方法是单独的类,但我想减少那个样板,并且他必须创建只有credit_ptr_id的N个单独的表。

1 个答案:

答案 0 :(得分:1)

看一下django代理模型。它们可以让你完全按照自己的意愿行事。

http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

但是,在您的情况下,行为取决于字段值,那么您应该将自定义管理器添加到代理模型中,以便仅在查询中检索该类型的项目。