2012-01-26 22 views
1

私の(PHP)古いサイトのデータベーステーブルをDjangoにインポートしました。デフォルトでは、モデル内に多数の主キーフィールドが作成されていました(そのほとんどは、idではなくnews_idのようなものだったため)。Djangoの主キーフィールドを変更しました。管理者には表示されません

すべてのプライマリキーの名前をidに変更し、モデルからフィールドを削除しました。この問題は、私のNewsモデルに特有のものでした。私が追加する新しいものは管理者には表示されません。私は私の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つを検索すると、それは表示されませんが、検索の最後に「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

モデルを変更した後にデータベースを移行しましたか?テーブルを削除してsyncdbを再実行しようとしました – akonsu

+0

同じ名前の列の名前を変更するために、手動SQLスクリプトを実行しました。 syncdbは正常に実行されます。 –

+0

もデータベースの主キーですか?私はあなたが主キーに何が起こったのフィールドの名前を変更したという意味ですか? – akonsu

答えて

2

あなたが探している答え、私はあなたがDjangoのモデルに変更していないSQLスキーマにあると思います。

nullや、news_category_idの空白の値、news_categoryに存在しないカテゴリに属する​​ニュースなどが考えられます。私がチェックしたいもの:あなたはnews_category_idからidにニュースカテゴリの主キーの名前を変更した

  • 。ニュースの外来キーもnews_category_idにマップされていますか?
  • 余談として、私はあなたが、彼らはすでに何かからidに主キーの名前を変更する必要がある理由何らかの理由が表示されない、またnews_category.id

に存在もnews.news_categoryで撮影したすべての値です。それらをprimary_key=Trueとマークするだけでうまくいきます。 Djangoは、実際のフィールドの名前とは無関係に、モデルの整数主キーにアクセスする便利なエイリアスpkを提供します。

+0

これは可能かもしれませんが、私が追加しているコンテンツの 'news_category_id'値が' news_category'テーブルに確実に存在することが分かりました。 名前が変更された主キーが一致します(すべての古いレコードが正しいマッピングを示しています)。 サードパーティのアプリケーション(django-taggitとPhotologue)で問題が発生したため、名前を変更しました。これらのアプリケーションは、モデルに追加のフィールドを関連付けるときには機能しません。デフォルトの主キーを使用するとすぐに機能しました。 –

関連する問題