Я думаю, что этот вопрос трудно ответить, не понимая вашу бизнес-логику немного более четко. Вот мои предположения:
- Конфигурируемых варианты специальные, т.е. вы продаете шары в красных, синих и желтых, рубашках в малых, среднем и большом, и т.д. Там нет никакого способа, чтобы представить эти варианты отвлеченно потому что они не превосходят категории. (Если бы это было так, ваш дизайн базы данных был бы неправильным. Если бы у всех были пользовательские параметры цвета, вы просто сделали бы это столбец в своей таблице базы данных.)
- Каждый вариант конфигурации имеет уже существующую фирменную идентификацию в вашей компании. Есть некоторые ску, связанные с красными шарами или что-то в этом роде. По какой-то причине необходимо иметь строку базы данных для каждой возможной опции конфигурации. (Если это не так, опять же, вы делаете все это неправильно.)
Если это так, моей самой простой рекомендацией было бы иметь некоторый базовый класс, который все продукты наследуют с помощью поля: representative_product_id
.Идея заключается в том, что для каждого продукта существует репрезентативная версия, которая отображается на странице категории или где-либо еще в вашем каталоге. В базе данных, это будет выглядеть следующим образом:
Name id representative_id
red_ball 1 1
blue_ball 2 1
green_ball 3 1
small_shirt 4 4
medium_shirt 5 4
large_shirt 6 4
unique_thing 7 7
Что касается Джанго запросов, я хотел бы использовать F objects
, если у вас есть версии 1.1 или более поздней версии. Просто:
SimpleProduct.objects.filter(representative_id=F('id'))
Это вернет запрос, чьи представительские идентификаторы соответствуют их идентификаторам.
На данный момент кто-то будет требовать целостности данных. Главное условие состоит в том, что representative_id
должен во всех случаях указывать на объект, representative_id
соответствует его id
. Есть способы принудительного применения этого непосредственно, например, с помощью валидатора pre_save
или что-то в этом роде. Вы также можете сделать то же самое, разложив таблицу ProductType
, содержащую столбец representative_id
. Т.е .:
Products
Name id product_type
_________________________________
red_ball 1 ball
blue_ball 2 ball
green_ball 3 ball
small_shirt 4 shirt
medium_shirt 5 shirt
large_shirt 6 shirt
unique_thing 7 thing
Types
Name representative_id
_______________________________
ball 1
shit 4
thing 7
Это не отменяет необходимость обеспечения целостности с некоторым валидатором, но это делает его немного более абстрактным.
Это интересный дизайн. Я не понимаю предложенный вами запрос: SimpleProduct.objects.filter (представитель_id = F ('id')) Когда я запрашиваю db, мне нужно использовать подкачку, поэтому мне как-то нужно знать, что red_ball и blue_ball считаются как один продукт с selectbox, но если есть только red_ball, я все равно его покажу. – pablo
Да, это произойдет. То, что делает этот запрос, это только возвращаемые элементы, которые являются репрезентативными для их типа. Если элемент не связан с другими элементами, это нормально, просто убедитесь, что по умолчанию представитель_id = id. Это своего рода проекционное отображение: заданный набор продуктов, фильтруйте до тех, которые представляют их собственный тип. –