Сохранение данных в унаследованной модели Django - PullRequest
0 голосов
/ 08 января 2011

Я создаю приложение для сохранения данных и некоторых вычислений, выполненных с этими данными, идея состоит в том, чтобы хранить данные в одной модели, а вычисления - в другой. Итак, модели такие:

class FreshData(models.Model):
    name = models.CharField(max_length=20)
    one = models.IntegerField()
    two = models.IntegerField()

    def save(self, *args, **kwargs):
        Calculations()
        Calculations.three = self.one + self.two
        super(FreshData, self).save(*args, **kwargs)
        Calculations.save()

class Calculations(FreshData):
    three = models.IntegerField()

У меня есть ValueError жалоба на то, что "self.one" и "self.two" не имеют значений. Я считаю, что мой дизайн ошибочен / неправильн, и у django есть лучший / более простой способ хранения связанных данных.

1 Ответ

2 голосов
/ 08 января 2011

Вы только что создали экземпляр класса, но не сохранили calculations() в переменной, а также дайте своим именам классов заглавные буквы. Также ваш super вызов неверен, он должен ссылаться на вашу модель, а не Blog.

Причина, по которой self.one, вероятно, не имеет значения, заключается в том, что вы выполняете работу перед вызовом суперсохранительного вызова. Так что вместо этого делайте свою работу после сохранения "себя".

class FreshData(models.Model):
    name = models.CharField(max_length=20)
    one = models.IntegerField()
    two = models.IntegerField()

    def save(self, *args, **kwargs):
        super(FreshData, self).save(*args, **kwargs)
        calculations = Calculations()
        calculations.three = self.one + self.two
        calculations.save()

class Calculations(FreshData):
    three = models.IntegerField()

Кроме того, я не уверен, почему вам нужно расширить с FreshData, в вашем примере Calculations унаследует поля name, one и two от FreshData. Если вы хотите сохранить вычисления только в отдельной модели, просто сохраните ссылку на исходные данные, например, так:

class Calculations(models.Model):
    fresh_data = models.ForeignKey(FreshData)
    three = models.IntegerField()

Тогда просто убедитесь, что передали fresh_data при создании вашего Calculations:

def save(self, *args, **kwargs):
    super(FreshData, self).save(*args, **kwargs)
    calculations = Calculationrs(fresh_data=self)
    ...
...