Для каждого элемента обновить базу данных
Я полный новичок в 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.
Дайте мне знать, если это поможет!