Для каждого элемента обновить базу данных

Я полный новичок в Python/Django и пытаюсь понять, почему это не работает. У меня есть function, который содержит for loop, выполняет некоторую логику и затем обновляет модель. но когда у меня более 1 элемента в цикле, я получаю ошибку UNIQUE constraint failed: app_token.token_name.

Значит, я неправильно понимаю, как работает цикл?

функция

    tokens = Token.objects.all()
    for item in tokens:
        if item.token_contract_address is not None:          
            token = Token.objects.get(pk=item.id)
            parameters = {
                'address':token.token_contract_address
            } 
            session = Session()
            session.headers.update(headers)
            response = session.get(url, params=parameters)
            resp = json.loads(response.text)
            token_id = (resp['data'][next(iter(resp['data']))]['id'])
            logo = (resp['data'][next(iter(resp['data']))]['logo'])

            url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest'
            parameters = {
                'id':token_id
            }
            session = Session()
            session.headers.update(headers)
            response = session.get(url, params=parameters) 
            id = str(token_id)
            price = (json.loads(response.text)['data'][id]['quote']['USD']['price'])
            market_cap = (json.loads(response.text)['data'][id]['quote']['USD']['market_cap'])
            change = (json.loads(response.text)['data'][id]['quote']['USD']['percent_change_24h'])

            r = Token.objects.update(token_capture_date = formatedDate, token_price = price, token_name=item.token_name ) 

Я ожидаю, что этот Token.objects.update(token_capture_date = formatedDate, token_price = price, token_name=item.token_name ) будет обновлять модель на основе цикла item?

Модель очень проста:

class Token(models.Model):

    token_name = models.CharField(max_length=50, blank=False, unique=True)
    token_slug = models.CharField(max_length=50, blank=True,null=True)
    token_price = models.FloatField(blank=True,null=True)
    token_capture_date = models.DateField(blank=True,null=True)
    token_contract_address = models.CharField(max_length=50, blank=True,null=True)

    def __str__(self):
        return str(self.token_name)

Я использую обновление на objects и пробовал удалять token_name, и пробовал использовать token.token_name

Если я удаляю token_name=, то оба элемента в базе данных обновляются с одинаковыми значениями, что заставляет меня думать, что это строка r = Token.objects.update(token_capture_date = formatedDate, token_price = price, token_name=item.token_name ) нужно ли мне применить какой-то фильтр?

Спасибо

Я считаю, что, вызывая Token.objects.update(), вы фактически пытаетесь обновить все объекты Token. Поскольку имя_токена должно быть уникальным, а вы даете ему то же имя, что и другому объекту Token, это приводит к ошибке. Поскольку вы уже находитесь в цикле for, вы можете просто обновить токен, который обрабатывается в данный момент.

Моим предложением было бы использовать этот код вместо этого:

item.token_capture_date = formattedDate
item.token_price = price
item.save()

Это сделает так, что у текущего объекта токена, который обрабатывается в цикле for, значения соответствующих полей будут обновлены и сохранены в базе данных.

Кроме того, эта строка не нужна: token = Token.objects.get(pk=item.id) поскольку у нас уже есть доступ к токену через зацикленную переменную item.

Дайте мне знать, если это поможет!

Вернуться на верх