Вопрос

Я пытаюсь разработать модель для приложения, позволяющего двум людям делать ставки друг с другом (я знаю, звучит глупо ...).Что меня интересует, так это как связать ставку с пользователями.Структура выглядит следующим образом

|-------------|       |----------|
|    Bet      |       | User     |
| BetUser1    |       |----------|
| BetUser2    |
| Winner      |
| ...         |
|-------------|

Итак, у нас есть 2 человека, которые делают ставки друг с другом (оба Users из системы аутентификации django), а затем, после того, как один из них выиграет, будет определен победитель.Теперь все эти 3 поля имеют тип User, но:

  • Должен ли я сделать BetUser1 и BetUser2 отдельными полями или создать здесь какое-то отношение "многие к двум"?(при том, что соотношение "много к двум" является соотношением "много ко многим" и с некоторым внешним способом обеспечения не более 2 Users могут ли быть назначены для каждой ставки?
  • победителем может быть только пользователь 1 или пользователь 2, никто другой, конечно.Как мне следует создать это поле, еще одно ForeignKey(User), или что-то еще?

Просто ищу какую-нибудь свежую точку зрения, так как кажется, что в таком глупом случае я застрял с модельной системой django.

Это было полезно?

Решение

Я бы, вероятно, добавил третью модель для представления конкретной ставки, которую кто-то сделал, поскольку вполне возможно, что в ставку могут вступить более двух человек.Это выглядело бы примерно так:

USER        WAGER              BET
             User (FK(User))    Description
             Bet  (FK(Bet))     Winner (FK (Wager), null=True)
             Amount

Django автоматически сгенерирует user.wager_set и bet.wager_set на основе внешних ключей.Это позволяет вам легко повторять и отображать ставки для ставки, а также ставки от каждого пользователя.Вы также можете добавить unique_together ограничение на User и Bet в таблице ставок, чтобы каждый пользователь мог сделать только одну ставку.

Когда все ставки сделаны и выбран победитель, вы просто устанавливаете bet.winner.

В случае, если вы столкнетесь с этим, вы можете увидеть предупреждение о related_name имея Bet указать на Wager и Wager указать на Bet.Чтобы исправить, просто добавьте related_name=wagers Для Wager.bet.

Другие советы

Что вам нужно, так это отношение "Многие ко многим" с дополнительными данными (напримерсумма ставки, введенное время,...)

Существует глава об этом в превосходных документах Django по написанию моделей.

Тайлер уже обрисовал подходящую схему для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top