【发布时间】:2017-07-18 20:20:52
【问题描述】:
在一个类中是否可以存在多个多对多关系?这是我的想法:
一项政策可以翻译成多种语言
一种语言可以列出许多策略
一个国家/地区可以列出许多政策(即使是多种语言)
可以在许多国家/地区讨论一项政策
我正在使用 django、python3 和 mysql,我正在绕圈子。多对多关系似乎是问题所在。
多对多通过表不起作用: 语言 = models.ManyToManyField(Language, through="Policy_Detail")
循环错误信息的步骤:
别名 p3="python3"
p3 manage.py 迁移
错误信息:django.db.utils.OperationalError: (1050, "Table 'policytracker_country' 已经存在")
删除了 policytracker_country 和所有其他 policytracker 表
输入 p3 manage.py 进行迁移
未检测到更改
输入 p3 manage.py migrate
(1051,“未知表'PolicyDB.policytracker_flag'”)
mysql> 显示表;
+------------------------------+
| Tables_in_PolicyDB |
+------------------------------+
| policytracker_country |
| policytracker_events |
| policytracker_policy_user |
| policytracker_website |
| policytracker_website_filter |
+------------------------------+
使用 MySql 添加了 policytracker_flag 和 policytracker_label_links
(即使我在我的代码中没有提到它们中的任何一个)
删除了所有其他 policytracker 表
+----------------+
| Tables_in_PolicyDB |
+----------------------------+
| policytracker_flag |
| policytracker_label_links |
+----------------------------+
p3 manage.py makemigrations
未检测到更改
p3 manage.py 迁移
django.db.utils.ProgrammingError: (1146, "表 'PolicyDB.policytracker_policy_detail' 不存在")
+------------------------------+
| Tables_in_PolicyDB |
+------------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
|身份验证用户 |
| 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.policy_detail”模型类移到“policytracker.policy”类之前
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)
感谢您的帮助。
【问题讨论】:
-
是的,在一个类中可以有多个多对多关系。您能否更具体地说明您遇到的麻烦?您收到的确切错误消息是什么,“实施”具体是什么意思?你想做什么?
-
@ChidG 查看已编辑的问题
-
@ChidG 在我的 Policy 课程中,我将语言 = models.ManyToManyField(Language, through="Policy_Detail") 更改为 models.ManyToManyField(Language, through="PolicyLanguage"),运行 p3 makemigrations,p3 migrate并得到错误:django.db.utils.ProgrammingError: (1146, "Table 'PolicyDB.policytracker_policy_detail' 不存在")
标签: mysql django python-3.x