Создание экземпляра модели из экземпляра другой модели в Django без ссылки на исходный источник экземпляра - PullRequest
0 голосов
/ 11 декабря 2011

Я делаю игру. Инвентарь игрока содержит оружие. Оружие является примером модели оружия. При создании нового оружия шаблон оружия выбирается случайным образом из экземпляров модели Template. Затем все поля копируются для создания экземпляра оружия. Для этого я использую эту функцию:

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. Как мне изменить мой код, чтобы две модели сохранялись независимо друг от друга, чтобы при создании нового оружия из шаблона WeaponTemplate не добавлялось ничего в таблицу WeaponTemplate?

1 Ответ

0 голосов
/ 12 декабря 2011

Я думаю, что вы не должны использовать наследование между оружием и шаблоном оружия, 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...