在Django中从另一个模型实例创建模型实例,而不链接到原始实例源
我正在制作一个游戏。玩家的背包里可以放武器。这些武器是武器模型的实例。当创建一个新武器时,会从模板模型中随机选择一个武器模板。然后把所有的字段复制过来,来创建这个武器实例。为此,我使用了这个函数:
class ItemModel(models.Model):
def fromTemplate(self, templateInstance):
if issubclass(type(self), type(templateInstance)):
for field in templateInstance._meta.fields:
setattr(self, str(field.name), getattr(templateInstance, field.name))
self.pk = None
self.save()
for m2mField in templateInstance._meta.many_to_many:
setattr(self, m2mField.name, getattr(templateInstance, m2mField.name).all())
class Meta:
abstract = True
这是模型的定义:
class WeaponTemplate(ItemModel):
def __unicode__(self):
return str(self.id)
type = models.CharField(max_length=100, choices = TYPE_CHOICES)
category = models.CharField(max_length=100, choices = CATEGORY_CHOICES)
group = models.CharField(max_length=100, choices = GROUP_CHOICES)
name = models.CharField(max_length=25)
level = models.IntegerField(default=1)
frequency = models.IntegerField(default = 100)
rarity = models.CharField(max_length=8, choices = RARITY_CHOICES)
multiplier = models.IntegerField()
buyCost = models.IntegerField()
sellValue = models.IntegerField(blank=True, null=True)
class Weapon(WeaponTemplate):
def __unicode__(self):
return self.name
现在我遇到的问题是,“fromTemplate”这个函数还会在模板模型中添加一个新实例。所以当我这样做时:
randomWeaponTemplate = random.choice(WeaponTemplate.objects.all())
newWeapon = Weapon()
newWeapon.fromTemplate(randomWeaponTemplate)
newWEapon.save()
我在WeaponTemplate表中看到了一个新的条目。我应该如何修改我的代码,让这两个模型独立存储,这样当从武器模板创建新武器时,就不会在WeaponTemplate表中增加新的条目呢?
1 个回答
0
我觉得你不应该在武器和武器模板之间使用继承,因为在Django中,继承被当作一对一关系来处理。如果你想让你的代码更简洁,可以尝试这样做:
from django.db import models
from django.db.models.manager import Manager
class WeaponBase(models.Model):
def __unicode__(self):
return str(self.id)
name = models.CharField(max_length=25)
level = models.IntegerField(default=1)
frequency = models.IntegerField(default = 100)
multiplier = models.IntegerField()
buyCost = models.IntegerField()
sellValue = models.IntegerField(blank=True, null=True)
class Meta:
abstract = True
class RandomManager(Manager):
def get_query_set(self):
return super(RandomManager, self).get_query_set().order_by('?')[0]
class WeaponTemplate(WeaponBase):
objects = Manager()
random = RandomManager()
class Weapon(WeaponBase):
@classmethod
def fromTemplate(cls, weaponTemplate):
w = Weapon()
for field in w._meta.fields:
setattr(w, str(field.name), getattr(weaponTemplate, field.name))
return w