2017-02-28 162 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