settings.py:
У меня есть модель, которая в основном работает как событие. Событие создается пользователем (ForeignKey). Затем другие пользователи могут присоединиться к событию и привести гостей (не пользователей, а просто "анонимных" пользователей). То есть, когда пользователи присоединяются к событию, они могут указать, сколько внешних гостей они хотят привести. Мне трудно понять, как расширить модель, чтобы включить количество гостей, которых каждый пользователь хотел бы привести. Пользователь может присоединиться к нескольким мероприятиям и привести разное количество гостей на каждое мероприятие. Другое дело, что когда пользователь создает мероприятие, он предоставляет список вариантов диеты. Эти варианты являются доступными диетами, поэтому, когда другой пользователь присоединяется к мероприятию, он должен выбрать, какой диеты он придерживается. Потенциальные гости, присоединяющиеся к пользователю, являются просто числом, и поэтому нет необходимости выбирать диету всех гостей, которых пользователь хочет добавить. Теперь, наконец, моя текущая модель выглядит следующим образом,
class VeganParticipants(models.Model):
participant = models.ForeignKey(MyUser, related_name='vegan_participant', on_delete=models.CASCADE)
guests = models.PositiveIntegerField(default=0)
class VegetarianParticipants(models.Model):
participant = models.ForeignKey(MyUser, related_name='vegetarian_participant', on_delete=models.CASCADE)
guests = models.PositiveIntegerField(default=0)
class MeatParticipants(models.Model):
participant = models.ForeignKey(MyUser, related_name='meat_participant', on_delete=models.CASCADE)
guests = models.PositiveIntegerField(default=0)
class Madklub(models.Model):
owner = models.ForeignKey(MyUser, related_name="owner", null=False, blank=False, on_delete=models.CASCADE)
dish = models.CharField(max_length=100, null=True, blank=True)
date = models.DateField(null=False, blank=False, unique=True)
active = models.BooleanField(default=True)
vegan_participants = models.ManyToManyField(VeganParticipants, related_name="vegan_participants", blank=True)
vegetarian_participants = models.ManyToManyField(VegetarianParticipants, related_name="vegetarian_participants", blank=True)
meat_participants = models.ManyToManyField(MeatParticipants, related_name="meat_participants", blank=True)
diet = ArrayField(
models.CharField(choices=DIET_OPTIONS, max_length=10, default="vegetarian")
)
class Meta:
ordering = ('date',)
Как вы видите, я фактически создал три дополнительные модели, по одной для каждого из возможных вариантов диеты. Таким образом, когда пользователь присоединяется к мероприятию (Madklub), он также создается в соответствующей модели диеты, включая количество гостей. Мне кажется, что такой способ не очень приятен.
Создание событий работает как ожидалось, Пользователь создает событие и назначается на участников + сколько угодно гостей, которых он выбирает. Теперь возникает проблема, пользователь может успешно присоединиться к событию, а также указать количество гостей, которых он хочет привести. Однако они могут присоединиться несколько раз, поскольку я не знаю, как проверить, существуют ли они уже среди участников. И я чувствую, что это очень трудно проверить из-за того, как я создал модель. То же самое касается выхода из мероприятия, я не знаю, как удалить только текущего пользователя из мероприятия, поскольку я не могу проверить, в качестве кого он изначально присоединился (вариант с диетой). Побочное замечание, если пользователь покидает мероприятие, его гости также должны быть удалены, поэтому я попытался создать дополнительные модели
Если у кого-нибудь есть идеи, как переписать мою модель и сериализатор, я буду очень, очень благодарен. Модель Madklub должна быть создана пользователем и быть указана как владелец, владелец также должен быть включен в состав участников. Пользователи должны иметь возможность присоединиться к событию (один раз) и выбрать, сколько гостей (не пользователей) привести. Пользователь, присоединяющийся к мероприятию, также должен иметь возможность выбрать желаемую диету.
Извините за длинную стену текста. Любая помощь будет высоко оценена!!!