Заполнение 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(...), чтобы избежать сбоя.