我是 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 )我需要應用某種過濾器嗎?
謝謝
uj5u.com熱心網友回復:
我相信通過呼叫 Token.objects.update() 您實際上最終會嘗試更新所有 Token 物件。由于 token_name 必須是唯一的,并且您為其賦予與另一個 Token 物件相同的名稱,因此會引發該錯誤。由于您已經處于 for 回圈中,因此您可以簡單地更新當前正在處理的令牌。
我的建議是改用此代碼:
item.token_capture_date = formattedDate
item.token_price = price
item.save()
這將使得在 for 回圈中正在處理的當前令牌物件具有其各自的欄位值更新并保存在資料庫中。
此外,這一行是不必要的:token = Token.objects.get(pk=item.id)因為我們已經可以通過回圈變數 item 訪問令牌。
如果這有幫助,請告訴我!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/420203.html
標籤:
上一篇:洗掉字典字典中的回圈資料
