Как реализовать несколько типов данных для объекта в Django? - PullRequest
1 голос
/ 05 апреля 2011

Я хотел бы знать, как лучше связать различные типы данных с объектом в Django. Некоторые из типов должны быть строковые, логические, файл изображения, выбор из списка или ссылка. Например, скажем, у вас есть модель продукта. Для продукта X вы захотите добавить атрибут изображения, строку для имени модели и ссылку. Для продукта Y возможными атрибутами будут изображение, десятичное значение веса. Как лучше всего это настроить? Есть ли доступные пакеты, которые делают это или что-то подобное?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Вы можете создать отдельную модель, которая позволяет вводить пустые / нулевые значения для каждого поля.Или используйте наследование модели django, если вы настраиваете типы продуктов, которые имеют сходные желаемые атрибуты или попадают в категории.Кажется, что вы запрашиваете необязательные атрибуты, которые просто потребуют от вас определить необязательные поля в модели (первый пример).

null ref, пустоref

Без наследования:

class Product(models.Model):
    name = models.CharField()
    image = models.ImageField(blank=True, null=True)
    weight = models.DecimalField(blank=True, null=True)

Наследование ref:

class Product(models.Model):
    name = models.CharField()

    class Meta:
        abstract = True

class ProductTypeA(Product):
    image = models.ImageField()

class ProductTypeB(Product):
     weight = models.DecimalField()

редактировать:

читать об отношениях в docs и docs

class Product(models.Model):
    name = models.CharField()

class ProductImage(models.Model):
    product = models.ForeignKey(Product)
    image = models.ImageField()

class ProductWeight(models.Model):
    product = models.ForeignKey(Product)
    weight = models.DecimalField()

class ProductURL(models.Model):
    product = models.ForeignKey(Product)
    url = models.URLField()

class ProductFile(models.Model):
    product = models.ForeignKey(Product)
    file = models.FileField()

ProductXXXXX связаны с моделью продукта внешним ключом.Это отношения один ко многим, поэтому для каждого продукта вы можете иметь много productxxxx.

Например, вы можете создать продукт:

product_one = Product(name="product_one")
product_one.save()

Теперь вы хотите добавить веск этому продукту:

weight = ProductWeight(product=product_one, weight=3.55)
weight.save()

Чтобы увидеть все веса, связанные с продуктом:

product_one_weights = product_one.weight_set.all()
for weight in product_one_weights:
    print weight

Это позволяет вам иметь продукты с различными "атрибутами".

                      product_one
                           |
       -----------------------------------------
       |             |            |            |
 ProductWeight ProductImage ProductImage ProductFile

                      product_two
                           |
                     --------------
                     |            |            
                ProductURL   ProductImage 
0 голосов
/ 06 апреля 2011

СУБД со структурой на основе типов не предназначены для этого.Например, возьмем большую таблицу Google, в которой нет жалоб на то, что вы храните (т. Е. Типы свойств продукта A могут полностью отличаться от продукта B, хотя оба имеют тип Product).

Вам необходимо объектно-ориентированное хранилищесистема, с гибкостью типа.

Вы уверены, что хотите это любой ценой?Мы все еще можем сделать это, но с большим количеством накладных расходов.Вот псевдокод.

Model Product:
        id (primary key)

Model AttributeType:
   """
   Defines various data types available for storage.
   ex: (1, 'INT') or (2,'STRING') or (3, 'FLOAT')
   """
      id:
      name:

Model ProductAttributes:
   """
   Stores various attributes of a product
   Ex: (P1,ATT1,100) or (P1, ATT3, 10.5) or (P2, ATT2, "ABCD")
   """
      FK-> Product
      FK-> AttributeType
      Name 'String'
      Value Blob
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...