如何解决如何在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
解决方法
我今天偶然发现了这个问题,最终通过使用 through
的 ManyToManyField
参数解决了它。然而,我为 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_banglaenglishrelations |
---|
bng_id_id |
eng_id_id |
并达到了我的目的。您可以做类似的事情来解决您的问题并将任何领域提升为 pk
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。