在Django建立一个智能工厂

时间:2011-03-08 11:02:32

标签: python django

我一直试图弄清楚这一段时间,但收效甚微。我正在尝试编写一个与Django的ORM兼容的类工厂,这样我就可以采用这样的模型架构:

Product
    SubclassOfProduct0
    SubclassOfProduct1
    ....

像这样工作:

Product.objects.get(pk=7) // returns the result of SubclassOfProduct0(pk=7)
Product.objects.filter(propname="w00t") // returns a QuerySet of Product objects

所以我在想这样的事情:

class ProductManager(models.Manager):
    def get(self, *a, **kwa):
        # Get the id from Products (somehow)
        if product.type == Product.TYPE_SUBCLASS0:
            return ProductSubClass0.objects.get(pk=kwa["pk"])


class Product(models.Model):

    TYPE_SUBCLASS0 = 0
    TYPE_SUBCLASS1 = 1

    objects = ProductManager()

    def __init__(self, *a, **kwa):
        self.set_defaults()

    def set_defaults(self):
        pass


class ProductSubClass0(models.Model):
    def set_defaults(self):
        self.type == self.TYPE_SUBCLASS0

......但我不知道怎么做“对”。有人能在这里说清楚吗?

3 个答案:

答案 0 :(得分:2)

Django Tagging在models.py中有一个很好的例子,说明它如何计算出特定类的内容类型。我目前正在使用权限开发的另一个模块中使用该模式。

答案 1 :(得分:0)

您可以将Product作为子类,如此处所述:http://docs.djangoproject.com/en/1.2/topics/db/models/#model-inheritance

class OtherProduct(Product):
    battery_life = …

如果您不需要直接使用它,也许也可以使Product成为一个抽象基类。

答案 2 :(得分:0)

您可以使用具有通用关系的实体框架。例如,在models.py中:

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

# Product
class Product(models.Model):
    name = models.CharField(max_length=128)
    pub_date = models.DateTimeField('date published', null=True)
    productDescription = models.CharField(max_length=400)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')


#Shirt Product type
class ShirtProduct(models.Model):
    product  = generic.GenericRelation(Product)



#Book Product type
class BookProduct(models.Model):
    product  = generic.GenericRelation(Product)

...

对于搜索一个产品ID,您可以在ProductManager中使用此方法:     product = generic.GenericRelation(产品,                                    content_type_field = 'content_type_fk',                                    object_id_field = 'object_primary_key')

(在djangoproject page的同一部分中反向泛型关系)