更改了Django的主键字段,现在项目不会出现在管理员中

时间:2012-01-26 23:45:26

标签: django django-models

我将我的(PHP)旧网站的数据库表导入Django。默认情况下,它在模型中创建了一堆主键字段(因为大多数字段都被称为news_id而不是id)。

我刚刚将所有主键重命名为id,并从模型中删除了字段。然后问题出现在我的新闻模型中。我添加的新内容未显示在管理员中。当我从我的ModelAdmin中删除以下行时,它们会显示:

list_display = ['headline_text', 'news_category', 'date_posted', 'is_sticky']

具体来说,news_category字段会导致问题。如果我从该列表中删除它,那么我会看到我的新对象。现在,当我直接编辑这些项目(使用项目ID攻击URL)时,它们具有有效的类别,同样在数据库中。这是模型定义:

class NewsCategory(models.Model):

    def __unicode__(self):
        return self.cat_name

    #news_category_id = models.IntegerField(primary_key=True, editable=False)
    cat_name = models.CharField('Category name', max_length=75)
    cat_link = models.SlugField('Category name URL slug', max_length=75, blank=True, help_text='Used in URLs, eg spb.com/news/this-is-the-url-slug/ - generated automatically by default')

    class Meta:
        db_table = u'news_categories'
        ordering = ["cat_name"]
        verbose_name_plural = "News categories"

class News(models.Model):

    def __unicode__(self):
        return self.headline_text

    #news_id = models.IntegerField(primary_key=True, editable=False)
    news_category = models.ForeignKey('NewsCategory')
    writer = models.ForeignKey(Writer) # todo - automate
    headline_text = models.CharField(max_length=75)
    headline_link = models.SlugField('Headline URL slug', max_length=75, blank=True, help_text='Used in URLs, eg spb.com/news/this-is-the-url-slug/ - generated automatically by default')
    body = models.TextField()
    extra = models.TextField(blank=True)
    date_posted = models.DateTimeField(auto_now_add=True)
    is_sticky = models.BooleanField('Is this story featured on the homepage?', blank=True)
    tags = TaggableManager(blank=True)

    class Meta:
        db_table = u'news'
        verbose_name_plural = "News"

您可以看到我已经注释掉自动生成的主键字段。

似乎Django认为我的新项目没有news_category_ids,但他们肯定会这样做。我尝试编辑现有的新闻并更改类别,它正常工作。如果我搜索其中一个新项目,它没有显示,但搜索的底部显示“发现1个新闻”,所以发生了一些事情。

感激不尽的任何提示。

编辑:这里也是我的ModelAdmin:

class NewsCategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {"cat_link": ("cat_name",)}
    list_display = ['cat_name', '_cat_count']

    def _cat_count(self, obj):
        return obj.news_set.count()
    _cat_count.short_description = "Number of news stories"      

class NewsImageInline(admin.TabularInline):
    model = NewsImage
    extra = 1    

class NewsAdmin(admin.ModelAdmin):
    prepopulated_fields = {"headline_link": ("headline_text",)}
    list_display = ['headline_text', 'news_category', 'date_posted', 'is_sticky'] #breaking line
    list_filter = ['news_category', 'date_posted', 'is_sticky']
    search_fields = ['headline_text']
    inlines = [NewsImageInline]

1 个答案:

答案 0 :(得分:2)

您认为您正在寻找的答案将在于您更改的SQL架构,而不是django模型中的。

它可能与nullnews_category_id中的空白值或属于news_category中不存在的类别的新闻有关。我要检查的事情:

  • 您已将新闻类别中的主键从news_category_id重命名为id。新闻中的外键是否也映射到news_category_id而不是其他任何内容?
  • news.news_category中捕获的所有值是否也出现在news_category.id

另外,除此之外,我还没有看到任何理由您需要将主键重命名为id的原因。只标记它们primary_key=True就可以了。 Django为您提供了一个方便的别名pk来访问模型的整数主键,而不管该字段的名称实际是什么。