Заполнение sql-таблицы внешними ключами с помощью django

У меня возникли проблемы с вставкой данных в мою sql базу данных при использовании django. Настройка таблиц, а также их заполнение через страницу администратора работает отлично, но у меня есть функция скрапера, которая запускается каждые 24 часа и должна вставлять данные.

from datetime import datetime
from .faceScraper import faceScraper as fc


def Dbpopulator():

    from ..models import Event

    [title_list, time_list, location_list, nation_list] = fc()
    print("scraped")
    for i in range(len(title_list)):
        
        e = Event()
        
        e.title = title_list[i]
        e.starttime = time_list[i][0]
        e.endtime = time_list[i][1]
        e.location = location_list[i]
        
        instance = e.save(commit=False)
        
        instance.nation = nation_list[i]
       
        instance.save()

Проблема возникает, когда я пытаюсь установить нацию, которая является внешним ключом, из файла модели, приведенного ниже.

from django.db import models

# Create your models here.


class Nation(models.Model):
    name = models.CharField(max_length=80, primary_key=True)

    description = models.TextField()

    Facebook = models.CharField(max_length=80, null=True, blank=True)

    def __str__(self):
        return self.name


class Event(models.Model):
    title = models.CharField(max_length=80, unique=True)

    starttime = models.DateTimeField(null=True, blank=True)

    endtime = models.DateTimeField(null=True, blank=True)

    nation = models.ForeignKey(
        Nation, on_delete=models.CASCADE, default=None, null=True, blank=True)

    location = models.CharField(max_length=80, null=True, blank=True)

    def __str__(self):
        return self.title

Я пробовал много разных способов, в основном просто устанавливая e и сохраняя как обычно, а также вырезая все экземпляры и commit=false.

e.nation = nation_list[i]
e.save()

Но это просто не работает, я также очень уверен, что база данных уже заполнена нациями, которые содержат имена, соответствующие тому, что я пытаюсь вставить, так как я могу видеть их на странице администратора. Любая помощь приветствуется!

Сначала необходимо получить экземпляр Nation. Если nation-list содержит имена наций, вы можете получить их следующим образом :

e = Event()
...
e.nation = Nation.objects.get(name=nation_list[i])
e.save()

Если вы не уверены на 100%, что предоставленное имя будет соответствовать Nation, вы можете использовать .filter(...).first(), а не .get(...), чтобы избежать сбоя.

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