2017-02-28 163 views
-1

單個類中可能存在多個多對多關係嗎?這裏是我的想法:Django多對多關係不起作用

策略可以被翻譯成多種文字
一個語言可以列出許多政策

一個國家可以列出許多政策(甚至是多國語言)
策略可以在許多討論國家

我正在使用django,python3和mysql,我正在圈子裏。多對多的關係似乎成了問題。

多對多通過表不工作: 語言= models.ManyToManyField(語言,通過= 「Policy_Detail」)

步驟圓形錯誤消息:

別名P3 = 「python3」

P3 manage.py遷移
錯誤消息:django.db.utils.OperationalError:(1050, 「表 'policytracker_country' 已存在」)

下降policytracker_country和所有其他policytracker表

鍵入P3 manage.py使遷移
沒有變化來檢測

鍵入P3 manage.py遷移
(1051, 「未知表 'PolicyDB.policytracker_flag'」)

mysql> show tables;
+ ------------------------------ +
| Tables_in_PolicyDB |
+ ------------------------------ +
| policytracker_country |
| policytracker_events |
| policytracker_policy_user |
| policytracker_website |
| policytracker_website_filter |
+ ------------------------------ +

添加policytracker_flag和使用MySQL policytracker_label_links(即使我不在我的代碼中沒有提及它們中的任何一個)
丟棄了所有其他策略追蹤表

+ --------------------------- - +
| Tables_in_PolicyDB |
+ ---------------------------- +
| policytracker_flag |
| policytracker_label_links |
+ ---------------------------- +

P3 manage.py makemigrations
沒有變更檢測

p3管理。PY遷移

django.db.utils.ProgrammingError:(1146, 「表 'PolicyDB.policytracker_policy_detail' 不存在」)
+ ----------------- ------------- +
| Tables_in_PolicyDB |
+ ------------------------------ +
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| policytracker_country |
| policytracker_events |
| policytracker_policy_user |
| policytracker_website |
| policytracker_website_filter |
+ ------------------------------ +

在'policytracker'之前移動'policytracker.policy_detail'模型類。政策」類
NameError:名字 '政策' 沒有定義

遷回來
P3 manage.py makemigrations
沒有變化來檢測

P3 manage.py遷移
「表 'policytracker_country' 已存在「
...我們走完了一圈 - 看到第一條錯誤信息

我在做什麼錯了?這裏的模型:

class Website_Filter(models.Model): ...

class Language(models.Model): 
     iso_language     = models.CharField(max_length = 2, primary_key=True) 
     flag_image_filename    = models.CharField(max_length = 10, default='en.png') 
     nav_section_policy_list_title = models.CharField(max_length = 30, default='Policies') 
     ... 

    class Country(models.Model): 
     language_country_code   = models.CharField(max_length = 5, primary_key=True, default="en/ca") 
     country_name     = models.CharField(max_length = 50) 

    class Policy(models.Model): 
     image_filename = models.CharField(max_length = 30) 
     start_date  = models.DateField(default = None) 
     languages  = models.ManyToManyField(Language, through="Policy_Detail") 
     countries  = models.ManyToManyField(Country) 

    class Policy_Detail(models.Model): 
     policy   = models.ForeignKey(Policy) 
     language   = models.ForeignKey(Language) 
     needs_translation = models.BooleanField(default = True) 
     name    = models.CharField(max_length = 50) 
     description1  = models.TextField() 
     description2  = models.TextField() 
     description3  = models.TextField() 
     twitter_handle = models.CharField(max_length = 30, default='') 
     subreddit   = models.CharField(max_length = 30, default='') 

    class Website(models.Model): 
     name   = models.CharField(max_length = 20, unique=True) 
     ip_address  = models.GenericIPAddressField() 
     link   = models.CharField(max_length = 50) 
     is_pending  = models.BooleanField() 
     is_allowed  = models.BooleanField()     

    class Official_Site(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Interviews(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Frequently_Asked_Questions(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Articles(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Books(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Petitions(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Actions(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Rallies(Website): 
     policy = models.ForeignKey(Policy_Detail) 

    class Events(models.Model): 
     policy = models.ForeignKey(Policy_Detail) 
     event_date  = models.DateField(null=True) 
     ... 

    class Policy_User(models.Model): 
     country   = models.ForeignKey(Country) 
     username   = models.CharField(max_length = 30, default="Anonymous") 

    class Vote(models.Model): 
     policy   = models.ForeignKey(Policy) 
     p_user   = models.ForeignKey(Policy_User) 
     voting_date  = models.DateField(auto_now_add = True) 
     week_number  = models.IntegerField(default = 1) 
     vote_code   = models.IntegerField(default = 1) 

感謝您幫助。

+1

是,多個多對多的關係可能在一個類中。你能更具體地說明你遇到了什麼樣的麻煩嗎?什麼是你正在得到的確切的錯誤信息,以及'實施'具體是指什麼?你想做什麼? – ChidG

+0

@ChidG查看已編輯的問題 –

+0

@ChidG在我的Policy類中,我將models = Many.ManyField(Language,through =「Policy_Detail」)更改爲models.ManyToManyField(Language,through =「PolicyLanguage」),運行p3 makemigrations,p3 migrate出現錯誤: django.db.utils.ProgrammingError:(1146,「Table'PolicyDB.policytracker_policy_detail'does not exist」) –

回答

0

這看起來更像是一個遷移與數據庫狀態不同步的問題。我不認爲多領域是主要問題,儘管他們可能通過使遷移更復雜來加劇它。

儘管可以通過運行單個遷移,手動將遷移標記爲在數據庫中完整或其他煩人的方法來解決此問題,但這是解決問題的最直接和最簡單的方法,並且會爲您工作,因爲您不會數據庫中沒有任何數據。

  1. 下降,由您的數據庫中所有表。
  2. 刪除所有Django應用程序目錄中的migrations目錄。
  3. 運行manage.py makemigrations,然後再manage.py migrate