Django - Иерархическая связь между 3 моделями. Пост ссылается на цель, а цель ссылается на категорию

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

Метод 1:

class GoalAndPostCategory(AbstractBaseModel):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    goal_id = models.ForeignKey(Goal, on_delete=models.CASCADE)
    post_id = models.OneToOneField(Post, on_delete=models.CASCADE)

Создайте таблицу, где каждая строка - это только категория, цель и пост, но это не гарантирует, что, скажем, цель 1 с идентификатором поста 1 относится к той же категории, что и цель 1 с идентификатором поста 2. Поскольку это отдельные строки, существует возможность несоответствия (не уверен, насколько это важно).

Метод 2:

class Goal(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.SET_NULL, null=True, related_name="goal_creator_id")
    end_date = models.DateField(
        'End date', null=True, default=None, blank=True)
    description = models.CharField(max_length=255)
    category = models.ForeignKey(Cateogry, on_delete=models.CASCADE)


class Post(AbstractBaseModel):
    creator_id = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="post_created_by_id")
    goal_id = models.ForeignKey(Goal, on_delete=models.CASCADE)
    body = models.CharField(max_length=511)
    category = models.ForeignKey(Cateogry, on_delete=models.CASCADE)

Имеем поле категории в модели Post и Goal, но это также может означать, что они не связаны друг с другом, если при создании любого поста вы не получаете идею цели и не устанавливаете категорию на основе категории Goal (я не знаю, как строго обеспечить это, кроме переопределения create(), но это работает только в одном случае).

Есть предложения?

Вернуться на верх