проектирование структуры модели для Django - PullRequest
3 голосов
/ 31 октября 2008

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 31 октября 2008

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

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.

1 голос
/ 31 октября 2008

Вам необходимо отношение «многие ко многим» с дополнительными данными (например, сумма ставки, введенное время, ...)

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...