我一直试图弄清楚这一段时间,但收效甚微。我正在尝试编写一个与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
......但我不知道怎么做“对”。有人能在这里说清楚吗?
答案 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的同一部分中反向泛型关系)