在 Django 中填充数据库并检索视图中的值会因为外键而出错?

Populating a database in django and retrieving the values in the view gives error becaue of ForeignKey?

我正在使用脚本在django中填充模型数据库,但由于foreignKey关系似乎有问题。

填充脚本似乎工作正常,但在我尝试访问该页面后出现错误:

Exception Type:     DoesNotExist
Exception Value:    Week matching query does not exist. 

填充脚本:

    def add_week(week):
        w = Week.objects.get_or_create(date=week)
        return w

    def add_song(name, artist, position, week):
        s = week.song_set.get_or_create(name=name, artist=artist, position=position)
        return s

    this_week = (add_week(week=soup.time.text))[0]

    for position, (song_name, artist) in enumerate(chart):
        print "%d. %s - %s" % (position+1, song_name, artist)
        add_song(name=song_name, artist=artist, position=position+1, week=this_week)

型号:

from django.db import models

class Week(models.Model):
    date = models.CharField(max_length=50)
    def __unicode__(self):
        return self.date

class Song(models.Model):
    week = models.ForeignKey(Week, default=1)
    name = models.CharField(max_length=300)
    artist = models.CharField(max_length=300)
    position = models.SmallIntegerField()
    difference = models.SmallIntegerField(default=0)

    def __unicode__(self):
        return self.name

查看:

from django.shortcuts import render
from charts.models import Song, Week

# Create your views here.
def chart(request):
    songs = Song.objects.order_by('position')
    week = Week.objects.get(pk=1)  #here comes the error, even though I see two weeks in admin view

def changed_since_last_week(request):
    week = Week.objects.get(pk=5)
    last_week = Week.objects.get(pk=6)
    songs = Song.objects.filter(week=week).order_by('position')
    songs_last_week = Song.objects.filter(week=last_week)
    context_dict = {'songs_last_week': songs}
    for song in songs:
        song_last= Song.objects.all().filter(name=song.name)
        if song_last:
           song.objects.difference = song_last.position - song.position
    return render(request, 'charts/change.html', context_dict)

如果你在admin视图中查看url,数据库中这两周的主键真的是1(和2)吗?如果您多次测试生成脚本(或者之前可能使用过数据库),这两条记录可能恰好具有 1(或 2)以外的其他主键。

此外,如果您想要特定的记录,您可以按模型的每个字段进行查询,例如Week.objects.get(date='my_hardcoded_date')。 (顺便说一下,我猜 date 中的值是自定义的,所以你不能使用 Django 的原生 DateFieldDateTimeField 之一)。