代码之家  ›  专栏  ›  技术社区  ›  Koobz

构造Django应用程序以将自定义业务规则附加到对象实例

  •  0
  • Koobz  · 技术社区  · 14 年前

    我不知道如何构造代码以适应特定于 实例 一种特殊的模型。

    例如。假设我有一个带有类型字段和 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张照片”。单独的资源类型是定量的,但是有一个通用的credit表为您提供各种内容类型的credit。计算列表和照片的逻辑根据使用的对象类型而有所不同。

    即。:

    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()
    

    我目前的方法是单独的类,但是我想减少这个样板文件,并且需要创建N个单独的表,其中只有一个 credit_ptr_id .

    1 回复  |  直到 14 年前
        1
  •  1
  •   Evgeny    14 年前

    看看django代理模型。他们允许你做你想做的事。

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

    但是,由于在这种情况下,行为依赖于字段值,因此应该将自定义管理器添加到代理模型中,该模型只检索查询时该类型的项。