Вы можете создать абстрактные модели Game
, PubgGame
и ClashRoyaleGame
, которые наследуются от вашей абстрактной модели. Это даст вам две основные гибкости:
- Поскольку
Game
будет абстрактной моделью, для нее не будет создано никакой таблицы. У вас будут только столы для PubgGame
и т. Д. Моделей игр.
- Вы можете добавить определенные поля для каждой игры, такие как
prize_per_kill
.
Но при использовании этого решения возникнет проблема; Ваши абстрактные модели нельзя использовать в качестве ForeignKey в других моделях. Поэтому вам нужно найти способ представить свои модели PubgGame
и ClashRoyaleGame
в одном поле ForeignKey. Для этого в Django есть специальное поле: GenericForeignKey . Вам нужно указать CoontentType и PositiveIntegerField на свой GenericForeignKey, чтобы иметь возможность хранить идентификаторы первичного ключа ваших игровых моделей.
# models.py
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
class Game(models.Model):
users = models.ManyToManyField(User, through="Membership")
name = models.CharField(max_length=20)
desc = models.TextField()
class Meta:
abstract = True
class PubgGame(Game):
prize_per_kill = models.TextField() # I dont know what prize_per_kill means :)
class ClashRoyaleGame(Game):
some_other_field = models.TextField()
class Tournament(models.Model):
players = models.ManyToManyField(User,through="Subscription")
max_players = models.IntegerField(default=100)
tourney_type = models.CharField(max_length=20)
price = models.IntegerField()
time = models.DateTimeField()
tourney_id = models.CharField(max_length=50)
tourney_pass = models.CharField(max_length=15)
first_prize = models.IntegerField()
second_prize = models.IntegerField()
third_prize = models.IntegerField()
# GenericForeignKey related fields
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
game = GenericForeignKey('content_type', 'object_id')
Тогда вы можете использовать эти поля как:
>>> from your_ap.models import Tournament, PubgGame
>>> pubg_game = PubgGame.objects.create(prize_per_kill="some value")
>>> tournament = Tournament.objects.create(game=pubg_game) # I'm not setting other fields for simplicity.
>>> tournament.save()
>>> tournament.game_object # This will give you a PubgGame model object