Как назначить связанное с внешним ключом поле при создании объектов модели - PullRequest
1 голос
/ 06 ноября 2019

У меня есть модель Лиги, одно из ее поля код страны относятся как внешний ключ к другой модели Страна

class League(models.Model):                           
    league = models.IntegerField(primary_key=True)                                                   
    league_name = models.CharField(max_length=200)                                                   
    country_code = models.ForeignKey("Country",null=True, on_delete=models.SET_NULL)                 

class Country(models.Model):                          
    country = models.CharField(max_length=60)
    code = models.CharField(max_length=15,null=True)
    flag = models.URLField(null=True)               
    lastModified = models.DateTimeField(auto_now=True)

Когда я пытаюсь создать объект Лиги

data_json = leagues_json["api"]["leagues"]      
for item in data_json:                                 
    league_id = item["league_id"]                   
    league_name = item["name"]                      
    country = item["country"]                                              
    b = League.objects.create(league = league_id,league_name = league_name,country_code = country)

Я получаю en error:

ValueError: Cannot assign "'World'": "League.country_code" must be a "Country" instance.

Как я понимаю, ошибка возникает потому, что при создании объекта я не назначил country_code собственно поле Country объект.

Каксделать это?

1 Ответ

0 голосов
/ 06 ноября 2019

Вы можете сначала попытаться получить объект Country, а затем использовать его для создания League.

Может быть так (при условии, что item["country"] содержит код страны):

for item in data_json:                                 
    country = Country.objects.get(code=item["country"])
    b = League.objects.create(
        league=item["league_id"],
        league_name=item["name"],
        country_code=country)

Обратите внимание, что этот код:

  • будет выполнять поиск в базе данных в каждом цикле;это потенциально может быть оптимизировано для уменьшения количества запросов.
  • вызывает ошибку, если страны не существует;Вы можете добавить блок try-exc для обработки этих случаев.
...