Предположим, мы создаем сайт, где люди могут продавать что-либо другим людям.Каков наилучший способ сохранить это отношение в 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 и черный цвет.
Какой способ является правильным способом реализации этой логики?
Да, это то, чего я хочу. Спасибо! – Kirill