模型中的 Django 多态性
Django polymorphism in model
我想为不同的玩家设置不同的运动
像下面。有办法吗?
示例模型:
class Player(models.Model):
id = models.AutoField(primary_key=True)
sportType = models.CharField(max_length=15)
sportObj = generic.GenericForeignKey('content_type')
class Icehockey(models.Model):
id = models.AutoField(primary_key=True)
stick_brand = models.CharField(max_length=50)
skate_number = models.IntegerField()
class Basketball(models.Model):
id = models.AutoField(primary_key=True)
ball_brand = models.CharField(max_length=50)
uniform_color= models.CharField(max_length=10)
class Football(models.Model):
id = models.AutoField(primary_key=True)
shoeNumber = models.IntegerField()
uniform_size = models.CharField(max_length=10)
用法示例:
player1 = Player.objects.get(id=1).sportObj // returns <Icehockey object>
player2 = Player.objects.get(id=2).sportObj // returns <Basketball object>
player3 = Player.objects.get(id=3).sportObj // returns <Football object>
player4 = Player.objects.get(id=4).sportObj // returns <Football object>
编辑:
如果有人需要,Django 网站上有一份关于 How content types works 的文档。
我觉得你提供的例子没问题,我对模型做了一些修改以使其可用。
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Player(models.Model):
SPORT_CHOICES = (
('I', 'Icehockey'),
('B', 'Basketball'),
('F', 'Football'),
)
sportType = models.CharField(max_length=15,choices=SPORT_CHOICES)
sportObj = GenericForeignKey('content_type', 'object_id')
object_id = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
class Icehockey(models.Model):
stick_brand = models.CharField(max_length=50)
skate_number = models.IntegerField()
class Basketball(models.Model):
ball_brand = models.CharField(max_length=50)
uniform_color= models.CharField(max_length=10)
class Football(models.Model):
shoeNumber = models.IntegerField()
uniform_size = models.CharField(max_length=10)
我想为不同的玩家设置不同的运动 像下面。有办法吗?
示例模型:
class Player(models.Model):
id = models.AutoField(primary_key=True)
sportType = models.CharField(max_length=15)
sportObj = generic.GenericForeignKey('content_type')
class Icehockey(models.Model):
id = models.AutoField(primary_key=True)
stick_brand = models.CharField(max_length=50)
skate_number = models.IntegerField()
class Basketball(models.Model):
id = models.AutoField(primary_key=True)
ball_brand = models.CharField(max_length=50)
uniform_color= models.CharField(max_length=10)
class Football(models.Model):
id = models.AutoField(primary_key=True)
shoeNumber = models.IntegerField()
uniform_size = models.CharField(max_length=10)
用法示例:
player1 = Player.objects.get(id=1).sportObj // returns <Icehockey object>
player2 = Player.objects.get(id=2).sportObj // returns <Basketball object>
player3 = Player.objects.get(id=3).sportObj // returns <Football object>
player4 = Player.objects.get(id=4).sportObj // returns <Football object>
编辑: 如果有人需要,Django 网站上有一份关于 How content types works 的文档。
我觉得你提供的例子没问题,我对模型做了一些修改以使其可用。
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Player(models.Model):
SPORT_CHOICES = (
('I', 'Icehockey'),
('B', 'Basketball'),
('F', 'Football'),
)
sportType = models.CharField(max_length=15,choices=SPORT_CHOICES)
sportObj = GenericForeignKey('content_type', 'object_id')
object_id = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
class Icehockey(models.Model):
stick_brand = models.CharField(max_length=50)
skate_number = models.IntegerField()
class Basketball(models.Model):
ball_brand = models.CharField(max_length=50)
uniform_color= models.CharField(max_length=10)
class Football(models.Model):
shoeNumber = models.IntegerField()
uniform_size = models.CharField(max_length=10)