Скажу сразу, что только недавно начал знакомство с Django (код априори будет не ахти). Надеюсь на адекватную помощь или хотя бы какие-то обоснованные замечания. Заранее спасибо!) Кстати, версия Django 1.11, Python 3.6.
Ситуация таковая. При разработке магазина запутался в моделях. Нужно создать проще говоря такой путь в URL:
домен/раздел/подраздел/страница.
Усложняет все то, что названия вложенностей хочется сделать не на основании их id в БД. А как задавать им свой URl и при этом не прописывать в urls.py каждую ссылку (их достаточно много) я не додумался. Это одна сторона медали.
Вторая оказывается в связях между моделями. Постараюсь построить схему более понятно + рисунок.
Возьмем, например, два раздела: фрукты и овощи. У фруктов подразделами являются яблоки и апельсины, а у овощей - огурцы и помидоры. Все подразделы имеют страницы своих сортов, а также страницы гибридов, которые отображаются в обоих подразделах смешанных продуктов и имеют ссылки на каждый этот подраздел (типа теги или как-то так). Насчет вложенностей - это все.
Также есть "список" лучших сортов продукта, который отображается на страницах сортов, которые в этом списке есть.
Старался объяснить как можно понятнее, хоть и чувствуя, что выходит белиберда.
Почитав документацию про отношения many-to-one, many-to-many и one-to-one, а также про некоторые их ограничения, мягко говоря, впал в ступор. В models.py написал следующие модели в соответствии с тем, как понял:
from django.db import models
# Разделы (фрукты, овощи)
class Fruit_or_vegetable(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
# Подразделы (яблоки, апельсины, помидоры, )
class Product(models.Model):
name = models.CharField(max_length=20)
fruit_or_vegetable = models.ForeignKey(Fruit_or_vegetable, on_delete=models.CASCADE)
sort = models.ForeignKey(Sort, on_delete=models.CASCADE)
best = models.ForeignKey(Best, on_delete=models.CASCADE)
def __str__(self):
return self.name
# Страницы (сорта и гибриды)
class Sort(models.Model):
name = models.CharField(max_length=20)
two_product = models.ManyToManyField(Product, through='Hybrid')
def __str__(self):
return self.name
# Гибриды (два продукта)
class Hybrid(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
sort = models.ForeignKey(Sort, on_delete=models.CASCADE)
# Лучшие сорта (один продукт) P.S. Гибриды тоже могут включаться в список
class Best(models.Model):
product = models.ManyToManyField(Sort, though='Product')
why = models.TextField(max_length=50)
Как-то так. Надеюсь можно разобрать.
Если это правильный ход решения, то есть ли ошибки?
Может вообще не нужно писать такие зависимости и можно обойтись более простыми решениями.
В любом случае спасибо за уделенное внимание!