微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Django中更改Manytomany表的主键

如何解决如何在Django中更改Manytomany表的主键

我正在更改旧数据库的主键。我可以通过将id设置为主键来更改主键。

之前

class User(models.Model):
    name = models.CharField(max_length=5)
    email = models.CharField(max_length=5)
    age = models.CharField(max_length=5)

之后

class User(models.Model):
    id = models.BigIntegerField(primary_key=True)
    name = models.CharField(max_length=5)
    email = models.CharField(max_length=5)
    age = models.CharField(max_length=5)

然后

python manage.py makemigrations
python manage.py migrate

这很好。 但是我也想更改通过ManyToMany字段创建的表的认主键。

用户模型

class User(models.Model):
    id = models.BigIntegerField(primary_key=True)
    name = models.CharField(max_length=5)
    email = models.CharField(max_length=5)
    age = models.CharField(max_length=5)

UserProfile模型

class UserProfile(models.Model):
    id = models.BigIntegerField(primary_key=True)
    address = models.CharField(max_length=5)
    father_name = models.CharField(max_length=5)
    pincode = models.CharField(max_length=5)
    user = models.ManyToManyField(User)

ManytoMany字段创建一个名为User_user_userprofile的表,其ID为Autofield,基本上是先前的或认的Django主键。

id,user_id,userprofile_id ManytoMany Table

现在,如何更改ManytoMany Feild的主键,即Django创建的ID?

PS: 的Django:1.11 的Python:2.7.5 DB:sqlite3 3.7.17 2013-05-20

解决方法

我今天偶然发现了这个问题,最终通过使用 throughManyToManyField 参数解决了它。然而,我为 Django v3.2.6 解决了这个问题,但是 v1.11 的文档提到了相同参数的相同行为,所以希望该解决方案也适用于您的 Django 版本。这是 v1.11 ManyToManyField.through

文档的链接

through 参数允许您自己创建中间表(由 ManyToManyField 自动创建)。您可以更好地控制中间表的外观、它应该具有的字段以及它们的行为应该是什么。希望你能得到一张照片。

让我举例说明我遇到的问题以及我是如何解决它的。希望这能让这更清楚。

我试图在我现有的两个模型之间建立多对多关系。

我的第一个模型看起来像这样,

class BanglaWords(models.Model):
    class Meta:
        verbose_name_plural = 'Bangla Words'

    bng_id = models.CharField(max_length=16,primary_key=True)
    bangla_word = models.CharField(max_length=64)

    def __str__(self):
        return self.bangla_word

第二个看起来像,

class EnglishWords(models.Model):
    class Meta:
        verbose_name_plural = 'English Words'

    eng_id = models.IntegerField(primary_key=True)
    word = models.CharField(max_length=64)
    bangla_word = models.ManyToManyField(BanglaWords)

    def __str__(self):
        return self.word

但这导致了一个看起来像这样的中间表 wordnet_englishwords_bangla_word

wordnet_englishwords_bangla_word
id
englishwords_id
banglawords_id

但我不想这样,我想让 bng_id 成为这张桌子的 pk。我用 ManyToManyField.through 解决了这个问题,如下所示,

我自己定义了中间模型(表),并使用 through 参数指向我创建的新中间模型并指示 django 按照我想要的方式创建表。

首先我创建了中介模型,

class BanglaEnglishRelations(models.Model):
    class Meta:
        verbose_name_plural = 'Bangla English Relations'

    bng_id = models.OneToOneField('BanglaWords',primary_key=True,on_delete=models.CASCADE)
    eng_id = models.ForeignKey('EnglishWords',on_delete=models.CASCADE)

它根据我的需要将 bng_id 定义为主键。

其次,我告诉 ManyToManyField 中的 EnglishWords 将表格基于 BanglaEnglishRelations 之类的,

bangla_word = models.ManyToManyField(BanglaWords,through=BanglaEnglishRelations)

这导致表 wordnet_banglaenglishrelations 看起来像,

wordnet_banglae​​nglishrelations
bng_id_id
eng_id_id

并达到了我的目的。您可以做类似的事情来解决您的问题并将任何领域提升为 pk

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。