Создание модели с отношением ManyToMany к пользователям, как расширить информацию Users
Я пытаюсь создать модель, которая имеет (возможно, несколько) отношений ManyToMany с пользователями. В основном модель должна проводить мероприятие (Madklub), к которому могут присоединиться пользователи. Это я уже успешно реализовал, однако теперь я хочу сделать так, чтобы пользователи могли приводить гостей (Пользователи не зарегистрированы), теперь это просто должно быть число, сколько гостей приводит конкретный пользователь, но количество гостей должно быть как-то привязано к пользователю, так что в случае, если пользователь покидает мероприятие, то количество гостей также уменьшается от общего количества гостей.
Ниже приведена моя текущая модель,
DIET_OPTIONS = (
('vegan', 'Vegan'),
('vegetarian', 'Vegetarian'),
('meat', 'Meat')
)
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)
guests = ???
active = models.BooleanField(default=True)
vegan_participants = models.ManyToManyField(MyUser, related_name="vegan_participants", blank=True)
vegetarian_participants = models.ManyToManyField(MyUser, related_name="vegetarian_participants", blank=True)
meat_participants = models.ManyToManyField(MyUser, related_name="meat_participants", blank=True)
diet = ArrayField(
models.CharField(choices=DIET_OPTIONS, max_length=10, default="vegetarian")
)
class Meta:
ordering = ('date',)
class GuestInfo(models.Model):
???
Итак, сейчас у меня все устроено так, что когда пользователь вступает в Madklub (событие), он выбирает один из трех вариантов (мясо, вегетарианец, веган). И в зависимости от этого выбора они попадают в определенные отношения в модели. Однако теперь мне нужно обработать их гостей, их гости не должны выбирать вариант, они должны автоматически иметь вариант, выбранный пользователем, который привел гостей.
Итак, моя текущая идея состоит в том, чтобы создать отдельную модель, которая должна хранить некоторую информацию. Либо она должна хранить всю информацию об участниках (как пользователях, так и гостях), и тогда Madklub имеет поле OneToOne с информацией об участниках. Либо Madklub должен содержать поле ManyToMany с информацией о госте (мясо/вегетарианец/веган), и тогда эта модель также содержит целочисленное значение с количеством гостей.
Надеюсь, это имеет смысл, я не уверен, какой лучший способ сделать это, и я также не уверен, как реализация будет работать, поэтому любая помощь будет высоко оценена!
Мне кажется, что нынешний Madklub слишком тяжеловесен. Просто идея:
class Madklub(models.Model):
# event-specific fields like owner, dish date, active
class Registration(models.Model):
madklub = models.ForeignKey(Madklub, ...)
participant = models.ForeignKey(MyUser, ...)
food_preference = models.CharField(choices=DIET_OPTIONS, max_length=10, default="vegetarian")
number_invitation = models.IntegerField(...) # if you want a fast aggregation of diet options
class Invitation(models.Model): # turned out not necessary as the discussion went on
registration = models.ForeignKey(Registration, ...)
guest = models.ForeignKey(MyUser, ...)
Итак, вариант диеты хранится в модели регистрации, которая привязана к конкретному участнику (не гостю). В зависимости от того, насколько быстро вы хотите, чтобы агрегация работала, вы можете добавить поле sum в модель регистрации для количества гостей, или вы можете просто prefetch_related из Madklub вплоть до Invitations.