我将我的(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]
答案 0 :(得分:2)
您认为您正在寻找的答案将在于您更改的SQL架构,而不是django模型中的。
它可能与null
或news_category_id
中的空白值或属于news_category中不存在的类别的新闻有关。我要检查的事情:
news_category_id
重命名为id
。新闻中的外键是否也映射到news_category_id
而不是其他任何内容?news.news_category
中捕获的所有值是否也出现在news_category.id
另外,除此之外,我还没有看到任何理由您需要将主键重命名为id
的原因。只标记它们primary_key=True
就可以了。 Django为您提供了一个方便的别名pk
来访问模型的整数主键,而不管该字段的名称实际是什么。