سؤال

أحاول تصميم نموذج لتطبيق يسمح لشخصين بالمراهنة مع بعضهما البعض (أعلم أن هذا يبدو غبيًا...).ما أتساءل عنه هو كيفية ربط الرهان مع المستخدمين.الهيكل هو مثل هذا

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

إذن لدينا شخصان يراهنان مع بعضهما البعض (كلاهما Users من نظام مصادقة جانغو) وبعد فوز أحدهم، يكون هناك فائز.الآن كل هذه الحقول الثلاثة من النوع User, ، لكن:

  • هل يجب أن أجعل BetUser1 وBetUser2 حقلين منفصلين، أو أصمم علاقة متعدد إلى اثنين هنا؟(مع كون متعدد إلى اثنين متعددًا إلى متعدد ومع وجود طريقة خارجية لضمان عدم وجود أكثر من 2 Users يمكن تعيينها لكل الرهان؟
  • يمكن أن يكون الفائز إما المستخدم 1 أو المستخدم 2 فقط، ولا أحد آخر بالطبع.كيف ينبغي أن أقوم بإنشاء هذا المجال، وآخر ForeignKey(User), ، أو البعض الآخر؟

فقط أبحث عن وجهة نظر جديدة، حيث يبدو أنه في مثل هذه الحالة الغبية أنا عالق في نظام نموذج جانغو.

هل كانت مفيدة؟

المحلول

ربما سأضيف نموذجًا ثالثًا يمثل رهانًا محددًا وضعه شخص ما، حيث من الممكن أن يدخل أكثر من شخصين في الرهان.سيبدو شيء هكذا:

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

سيتم إنشاء جانغو تلقائيًا user.wager_set و bet.wager_set على أساس المفاتيح الخارجية.يتيح لك ذلك تكرار وعرض الرهانات بسهولة، بالإضافة إلى الرهانات من كل مستخدم.يمكنك أيضًا إضافة أ unique_together القيد على User و Bet في جدول الرهان بحيث يمكن لكل مستخدم إجراء رهان واحد فقط.

عند الانتهاء من الرهان بالكامل، واختيار الفائز، ما عليك سوى تعيينه bet.winner.

في حالة واجهت ذلك، قد ترى تحذيرًا بشأن related_name من خلال وجود Bet يشير إلى Wager و Wager يشير إلى Bet.لإصلاح، فقط أضف related_name=wagers ل Wager.bet.

نصائح أخرى

ما تحتاجه هو علاقة متعدد إلى متعدد مع بيانات إضافية (على سبيل المثال.مبلغ الرهان، الوقت الذي تم إدخاله،...)

هناك chaper حول هذا في مستندات Django الممتازة حول نماذج الكتابة.

لقد حدد تايلر بالفعل المخطط المناسب لهذا الغرض.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top