Создание фабрики умного класса в Джанго - PullRequest
1 голос
/ 08 марта 2011

Я пытался понять это некоторое время, но без особого успеха.Я пытаюсь написать фабрику классов, которая хорошо работает с 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 ]

2 голосов
/ 08 марта 2011

Django Tagging имеет прекрасный пример в models.py, как он выясняет тип содержимого определенных классов.В настоящее время я использую шаблон в другом модуле, который я разработал с разрешениями.

0 голосов
/ 03 января 2014

Вы можете использовать структуру сущностей с общими отношениями. Например, в 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)

....

Для поиска по одному идентификатору продукта, вы можете использовать этот метод в вашем ProductManager: product = generic.GenericRelation (Product, content_type_field = 'content_type_fk', object_id_field = 'object_primary_key')

(обратные родовые отношения в том же разделе страница djangoproject )

0 голосов
/ 08 марта 2011

Вы можете просто создать подкласс вашего Product, как описано здесь: http://docs.djangoproject.com/en/1.2/topics/db/models/#model-inheritance

class OtherProduct(Product):
    battery_life = …

Возможно, также сделайте Product абстрактным базовым классом, если вам не нужно использовать его напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...