Django: update_or_create повторяющиеся значения заполняются - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь обновить поля модели, используя update_or_create, который получает данные из API.Проблема заключается в том, что все поля заполняются только двумя последними значениями из i ['Concessional] и i [' Noncessional ']

Я использую внешний API для обновления следующей модели:

class Contributions(models.Model):
    trustee = models.ForeignKey(Trustee, on_delete = models.CASCADE)
    concessional_caps = models.FloatField(null = True, blank = True)
    noncessional_caps = models.FloatField(null = True, blank = True)

    concessional_contributions_to_this_fund = models.FloatField(null = True, blank = True)
    non_concessional_contributions_to_this_fund = models.FloatField(null = True, blank = True)

    concessional_contributions_to_other_fund = models.FloatField(null = True, blank = True)
    non_concessional_contributions_to_other_fund = models.FloatField(null = True, blank = True)

    concessional_contributions_as_allocated =models.FloatField(null = True, blank = True)
    non_concessional_contributions_as_allocated = models.FloatField(null = True, blank = True)

    concessional_amounts_above_caps = models.FloatField(null = True, blank = True)
    non_concessional_amounts_above_caps = models.FloatField(null = True, blank = True)

    concessional_available_total = models.FloatField(null = True, blank = True)
    non_concessional_available_total = models.FloatField(null = True, blank = True)

Используя следующий код:

for i in range(len(contribution_caps_data['Data']['Members'])):
            Contributions.objects.update_or_create(trustee = Trustee.objects.get(trustee_name = contribution_caps_data['Data']['Members'][i]["Name"]))
            for j in contribution_caps_data['Data']['Members'][i]['YearBreakdown']['ContributionDetails']:
                Contributions.objects.update_or_create(trustee = Trustee.objects.get(trustee_name =  contribution_caps_data['Data']['Members'][i]["Name"]),
                    defaults = {
                    'concessional_caps': j['Concessional'],
                    'noncessional_caps': j['NonConcessional'],

                    'concessional_contributions_to_this_fund': j['Concessional'],
                    'non_concessional_contributions_to_this_fund': j['NonConcessional'],

                    'concessional_contributions_to_other_fund': j['Concessional'],
                    'non_concessional_contributions_as_allocated': j['NonConcessional'],

                    'concessional_contributions_as_allocated': j['Concessional'],
                    'non_concessional_amounts_above_caps': j['NonConcessional'],

                    'concessional_amounts_above_caps': j['Concessional'],
                    'non_concessional_amounts_above_caps': j['NonConcessional'],

                    'concessional_available_total': j['Concessional'],
                    'non_concessional_available_total': j['NonConcessional']
                    }

                    )

Я пытаюсь создать новую запись вклада, первый цикл для получения имен (внешний ключ), а второй цикл дляна самом деле получить значения взносов

Как бы вы порекомендовали обойти это.Должен ли я предварительно обработать в пригодную для использования форму (возможно, словарь), а затем обновить модель.Простите, что это тривиальный вопрос, но я относительно новичок в Python и Django, но не могу найти решение.

1 Ответ

0 голосов
/ 15 марта 2019
  • Вы никогда не сохраняли данные
  • Попечитель модели: всегда ли гарантируется trustee_name получение экземпляра?Люди могут иметь одно и то же имя ...
  • аналогично модели Contributions - разве не должно быть какого-то года или чего-то другого?
  • использовать переменные и говорить имена переменных
  • нет range(len(... необходимо, если вы перебираете список

Вверху моей головы, это было бы лучше

for member in contribution_caps_data['Data']['Members']:
    trustee, created = Trustee.objects.get_or_create(trustee_name=member['Name'])
    if created:
        trustee.save()

    for contribution_detail in member['YearBreakdown']['ContributionDetails']:
        # WARNING: you need to change this, otherwise you'll always get the same contribution for the trustee...
        # Perhaps there's the year in the YearBreakdown...
        contribution, created = Contributions.objects.get_or_create(trustee=trustee)  # gets same contribution in each iteration...

        contribution.concessional_caps = contribution_detail['Concessional']
        contribution.noncessional_caps = contribution_detail['NonConcessional']
        # ... the same for all other attributes ...

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