2015-04-13 2 views
2

Предположим, мы создаем сайт, где люди могут продавать что-либо другим людям.Каков наилучший способ сохранить это отношение в Django?

К примеру, у нас есть две категории: Компьютеры и Автомобили

У нас есть некоторые фильтры для категорий: память, процессор, пробег, цвет

И у нас есть значения для этих фильтров: 4 Гб, 8 Гб, AMD , Intel, 0-9999, 10000 +, коричневый, черный (люди не могут просто ввести свои собственные ценности, они должны выбрать их из списка)

Пример Джанго код:

class Category(models.Model): 
    parent = models.ForeignKey('self', null=True, blank=True) 
    name = models.CharField(_('Name'), max_length=30) 


class Filter(models.Model): 
    categories = models.ManyToManyField(Category, db_index=True) 
    name = models.CharField(_('Name'), max_length=30) 


class FilterValue(models.Model): 
    filter = models.ForeignKey(Filter, db_index=True) 
    value = models.CharField(_('Filter value'), max_length=30) 

Итак, фильтры, относящиеся к категориям, значения фильтров, связанные с фильтрами. Теперь у нас есть таблицы:

категории:

id | name 
------------------ 
1 | Computers 
2 | Cars 

фильтры:

id | name 
------------------ 
1 | CPU 
2 | Memory 
3 | Mileage 
4 | Color 

категории-фильтры:

id | category_id | filter_id 
----------------------------- 
1 |   1 |   1 
2 |   1 |   2 
3 |   2 |   3 
4 |   2 |   4 

filter_values:

id | filter_id | name 
----------------------------- 
1 |   1 | Intel 
2 |   1 | AMD 
3 |   2 | 4GB 
4 |   2 | 8GB 
5 |   3 | 0-9999 
6 |   3 | 10000+ 
7 |   4 | Brown 
8 |   4 | Black 

И вот теперь возникает вопрос - как мне создать модель товара? Пример кода:

class Item(models.Model): 
    category = models.ForeignKey(Category, db_index=True) 
    name = models.CharField(_('Name'), max_length=30) 
    price = models.IntegerField(_('Price')) 

Но как связать это фильтры и значения фильтров properply в Django? Я могу создать два отношения Many2Many, но он создаст 3 базы данных. Тем не менее, это нужно только два:

пункт:

id | category_id | name 
------------------------------ 
1 |   1 | My computer 
2 |   2 | My car 

элемент фильтра-FILTER_VALUE:

id | item_id | filter_id | filter_value_id 
------------------------------------------ 
1 |  1 |   1 |    2 
2 |  1 |   2 |    3 
3 |  2 |   3 |    5 
4 |  2 |   4 |    8 

Так что теперь в БД двух пунктов: Мой компьютер с процессором AMD и памятью 4 Гб и мой автомобиль с пробегом 0-9999 и черный цвет.

Какой способ является правильным способом реализации этой логики?

ответ

2

Вы можете customize the many-to-many table в соответствии с предложенной вами таблицей. В вашем примере это может выглядеть следующим образом:

class Item(models.Model): 
    category = models.ForeignKey(Category, db_index=True) 
    name = models.CharField(_('Name'), max_length=30) 
    price = models.IntegerField(_('Price')) 
    filters = models.ManyToManyField(Filter, through='ItemFilter') 

class ItemFilter(models.Model): 
    item = models.ForeignKey(Item) 
    filter = models.ForeignKey(Filter) 
    value = models.ForeignKey(FilterValue) 

Просто обратите внимание на документы о том, как получить доступ к модели через поля и как это меняет соответствующий менеджер.

+0

Да, это то, чего я хочу. Спасибо! – Kirill

 Смежные вопросы

  • Нет связанных вопросов^_^