我在做游戏。 玩家的库存持有武器。 这些武器是武器模型的实例。 创建新武器时,会从“模板”模型实例中随机选择一个武器模板。 比所有字段都被复制来创建武器实例。 为此,我使用以下功能:

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()

我在WeaonTemplate表中看到一个新条目。 我应该如何修改我的代码以使两个模型独立存储,以便在使用awkTemplate创建新武器时,不会在WeaponTemplate表中添加任何内容?

===============>>#1 票数:0

我认为您不应该在武器和武器模板之间使用继承,django将继承视为OneToOneRelationship。 如果要使代码更干燥,则可以尝试使用以下方法:

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

  ask by Tristan Boudreault translate from so

未解决问题?本站智能推荐:

1回复

Django模型设计。 希望用户拥有其他模型实例的“集合”

我在尝试用django模型表示数据结构时遇到麻烦。 在我正在使用的应用程序中,用户可以上传曲目。 我为此使用了跟踪模型。 我们希望用户拥有与其帐户相关联的曲目(例如,他们喜欢的曲目)的集合。 该集合只是对轨道模型的ID的引用。 有人对如何设计这样的数据结构有任何建议吗?
2回复

Django模型中的硬编码属性

好的,这是在我看来很有意义但很难正确解释的问题之一:)我有一个django应用程序,我想在其中存储许多不同设备项的记录。 每种类型的设备都有一个自定义模型来存储其属性,例如下面的MyEquipment 。 每种类型的设备还将有一个“类别”,将其存储为属性非常有用。 要将这个属性保存到
2回复

如何在Django中建模“一个或多个”关系?

我有一个模型Owner 。 Owner的类型可以是“ Individual或“ Business 。 根据类型, Owner可能与Property模型具有一对一或一对多的关系。 如果为Individual ,则只能具有一个Property但是如果是Business ,则可能具有多个Prop
4回复

如何在Django中记录模型的每日排名?

我有一个模型,必须向该模型记录一个PositiveSmallIntegerField到该对象,该模型每天会用相关分数进行更新。 使用此模型的对象数永远不会超过100,并且得分/等级必须保留180天。 该数据库是Postgresql 9.2。 排名是每天根据另一个应用程序的分数计算
1回复

Django中按用户的软删除模型设计

我正在设计一个应用程序,其中用户发送/接收记录,并且我希望为记录中列出的每个用户分开删除操作(一个用户的删除操作不会对其他用户隐藏该记录)。 我的基本模型设计如下所示: 难道是更换的改善archived_by_xxxx用领域ManyToManyField来accounts.Comm
4回复

如何将外键选择限制为同一模型中的另一个外键

我正在制作Django应用程序,但遇到了问题。 我正在尝试定义一个模型,其中一个ForeignKey将依赖于另一个ForeignKey 。 说明部分 我的申请是关于做出选择。 假设您有一个decision ,一个decision有多个choice ,一个choice具有sta
2回复

Django:限制模型数据

我正在寻找一种方式来限制我可以通过模型获得的查询集。 假设我有以下模型(具有依赖项): 应当指出,我的真实模型要深入得多,并且与业务无关。 使用上下文处理器,我添加了一个公司实例来请求: 现在,我的问题是将对Company的子模型的访问限制为company的请求实例的
1回复

模型冗余Django表?

我正在努力找出Django项目的模型:一个用于跟踪Books的应用程序。 在其他领域中,每本书都具有Printer和Publisher ,两者基本相同。 因此,它是这样的: 在我看来,这是不好的数据库形式:它不是DRY。 另外,很多时候,一Book可能由出版同一本书或另一本书的
2回复

Django循环模型依赖

我的Django模型中有一个循环依赖,这样模型A有一个B的外键引用,而B有一个多对多的A引用。我已经查阅了其他SO帖子,并使用了字符串模型名称代替实际的课程,但无济于事。 这是我的两个类的缩写版本: 用户模型 上市模型 每次我尝试运行syncdb时 ,都会输出以下错误:
1回复

自动合并任意Django模型

我有两个要合并的Django-ORM托管数据库。 两者都具有非常相似的架构,并且都具有标准的auth_users表,以及其他一些互相引用的共享表以及auth_users,我想将它们自动合并到单个数据库中。 可以理解,这取决于外键关系以及在每个表中构成“唯一”记录的内容,这可能是非常重要的