Создайте миграцию данных с моделью метода перезаписи, save () - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь загрузить некоторые данные тестирования в приложение, используя опцию миграций. Все данные хранятся в файле .Yaml в приложении, и у меня есть несколько других миграций, которые отлично работают, загружая все данные.

Но у этого есть проблема.В этой модели (Транзакции) я создал 3 самописных поля, которые вычисляются при вызове метода save ().Этот процесс работает отлично, когда я отправил данные через представление.Но когда я отправляю его через миграцию, происходит сбой, как будто метод сохранения не перезаписывается.Я не знаю, что делать, чтобы выполнить загрузку как миграцию.

Миграция


    from django.db import migrations
    from django.core import serializers

    def transactions(apps, schema_editor):
        with open('fixtures/transactions.yaml') as trans:
            for obj in serializers.deserialize("yaml", trans):
                t=apps.get_model("acounts", "Transactions")()
               cat=apps.get_model("acounts","Category")
.objects.get(pk=obj.object.category.pk)
                cuen=apps.get_model("acounts", "Acount").objects.get(pk=obj.object.acount.pk)
                print(obj)
                t.tipo=obj.object.tipo
                t.description=obj.object.description
                t.monto=obj.object.monto
                t.date=obj.object.date
                # t.category=obj.object.category
                t.category=cat
                # t.acount=obj.object.acount
                t.acount=cuen
                t.save()

    class Migration(migrations.Migration):

        dependencies = [
            ('acounts', '0002_populate_acounts'),
        ]

        operations = [
            (migrations.RunPython(transactions))
        ]

Модель

class Transactions(models.Model):
    TYPE_CHOICES = (
        ('GASTO', 'Gasto'),
        ('INGRESO', 'Ingreso'),
        )

    tipo = models.CharField(
        choices=TYPE_CHOICES,
        max_length=20
    )

    description=models.CharField(max_length=100)
    monto=models.DecimalField(max_digits=25, 
        decimal_places=2,
        null=False)
    category=models.ForeignKey('Category', 
        on_delete=models.CASCADE,
        null=False)
    acount=models.ForeignKey('Acount',
        on_delete=models.CASCADE,
        null=False)
    date=models.DateField()



    total_USD=models.DecimalField(
        max_digits=25, 
        decimal_places=2,
        editable=False);    
    total_BTC=models.DecimalField(
        max_digits=25, 
        decimal_places=9,
        editable=False);    
    total_BSS=models.DecimalField(
        max_digits=25, 
        decimal_places=2,
        editable=False);
    total_EUR=models.DecimalField(
        max_digits=25, 
        decimal_places=2,
        editable=False);


    created_at=models.DateTimeField(
        auto_now_add=True,
        editable=False)
    updated_at=models.DateTimeField(
        auto_now=True,
        editable=False)


    def save(self):



        cotizations=Currency.objects.all()
        currency=self.acount.currency.name

        in_usd=self.monto/Currency.objects.get(name=currency).price_USD_now
        query_btc=in_usd*Currency.objects.get(name='BTC').price_USD_now
        query_bss=in_usd*Currency.objects.get(name='YEN').price_USD_now
        query_eur=in_usd*Currency.objects.get(name='EUR').price_USD_now

        self.total_USD=in_usd
        self.total_BTC=query_btc
        self.total_YEN=query_bss
        self.total_EUR=query_eur

        super(Transactions, self).save()

        return query_btc;

Ошибка

    raise utils.IntegrityError(*tuple(e.args))
django.db.utils.IntegrityError: (1048, "Column 'total_USD' cannot be null

Тот же метод отлично работает, когда выполняется через представление. Как я могу создать миграцию данных для этой модели, используя перезаписанный метод .save ()?

...