@PiggyPig

Сколько придется создать моделей и отношений?

Скажу сразу, что только недавно начал знакомство с Django (код априори будет не ахти). Надеюсь на адекватную помощь или хотя бы какие-то обоснованные замечания. Заранее спасибо!) Кстати, версия Django 1.11, Python 3.6.
Ситуация таковая. При разработке магазина запутался в моделях. Нужно создать проще говоря такой путь в URL:
домен/раздел/подраздел/страница.
Усложняет все то, что названия вложенностей хочется сделать не на основании их id в БД. А как задавать им свой URl и при этом не прописывать в urls.py каждую ссылку (их достаточно много) я не додумался. Это одна сторона медали.
Вторая оказывается в связях между моделями. Постараюсь построить схему более понятно + рисунок.

62be3d8046e84855a0514e04492ad5d9.png

Возьмем, например, два раздела: фрукты и овощи. У фруктов подразделами являются яблоки и апельсины, а у овощей - огурцы и помидоры. Все подразделы имеют страницы своих сортов, а также страницы гибридов, которые отображаются в обоих подразделах смешанных продуктов и имеют ссылки на каждый этот подраздел (типа теги или как-то так). Насчет вложенностей - это все.
Также есть "список" лучших сортов продукта, который отображается на страницах сортов, которые в этом списке есть.

Старался объяснить как можно понятнее, хоть и чувствуя, что выходит белиберда.

Почитав документацию про отношения 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)


Как-то так. Надеюсь можно разобрать.
Если это правильный ход решения, то есть ли ошибки?
Может вообще не нужно писать такие зависимости и можно обойтись более простыми решениями.
В любом случае спасибо за уделенное внимание!
  • Вопрос задан
  • 390 просмотров
Пригласить эксперта
Ответы на вопрос 1
class Category(models.Model):
    parent = models.ForeignKey('self', null=True)
    title = models.CharField(...)

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

Яблоко Гольден, это товар категории Фрукт, подкатегории Яблоко, подподкатегории Гольден.
Гибрид, это подкатегория имеющая две родительские категории. Следовательно: parent = models.ManyToManyField('self', null=True)

Лучший сорт - это просто булевое значение ->
# in class Category
is_best = models.Boolean(default=False)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы