【问题标题】:Django multiple many to many relationships not workingDjango多个多对多关系不起作用
【发布时间】: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


【解决方案1】:

这看起来更像是迁移与数据库状态不同步的问题。我不认为多对多领域是主要问题,尽管它们可能会通过使迁移更多来加剧它 复杂。

虽然您可以通过运行单个迁移、在数据库中手动将迁移标记为已完成或其他繁琐的方法来解决此问题,但这是解决问题的最直接、最干净的方法,并且对您有用,因为您不这样做'数据库中还没有任何数据。

  1. 从数据库中删除所有表。
  2. 删除所有 Django 应用目录中的 migrations 目录。
  3. 运行manage.py makemigrations,然后再次运行manage.py migrate

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多