从Django中另一个模型的实例创建模型实例,而不链接到原始实例sou

2024-07-04 05:59:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个游戏。玩家的库存中有武器。武器是武器模型的实例。创建新武器时,将从模板模型实例中随机选择一个武器模板。然后复制所有字段以创建武器实例。为此,我使用以下函数:

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

以下是模型定义:

^{pr2}$

现在我的问题是“fromTemplate”函数还在模板模型中添加了一个新实例。所以当我这样做的时候:

randomWeaponTemplate = random.choice(WeaponTemplate.objects.all())
newWeapon = Weapon()
newWeapon.fromTemplate(randomWeaponTemplate)
newWEapon.save()

我在weaotemplate表中看到一个新条目。我应该如何修改代码使这两个模型独立存储,以便在从weaponTemplate创建新武器时,不会对weaponTemplate表进行添加?在


Tags: 实例函数namein模型self模板field
1条回答
网友
1楼 · 发布于 2024-07-04 05:59:34

我认为你不应该在武器和武器之间使用继承,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

相关问题 更多 >

    热门问题