gpt4 book ai didi

python - 将新的 ManyToManyField 默认值追溯设置为现有模型

转载 作者:太空狗 更新时间:2023-10-29 22:14:57 24 4
gpt4 key购买 nike

我有一个 Django 模型(称为 BiomSearchJob),它目前处于事件状态,我想添加一个新的多对多关系以使系统更适合用户定制。以前,用户可以在不指定一组 TaxonomyLevelChoices 的情况下提交作业,但为了向系统添加更多功能,用户现在应该能够选择自己的分类级别。

这是模型:

class TaxonomyLevelChoice(models.Model):
taxon_level = models.CharField(
verbose_name="Taxonomy Chart Level", max_length=60)
taxon_level_proper_name = models.CharField(max_length=60)

def __unicode__(self):
return self.taxon_level_proper_name

class BiomSearchJob(models.Model):
...
# The new many-to-many relation
taxonomy_levels = models.ManyToManyField(
'TaxonomyLevelChoice', blank=False, max_length=3,
default=["phylum", "class", "genus"])

name = models.CharField(
null=False, blank=False, max_length=100, default="Unnamed Job",
validators=[alphanumeric_spaces])
...

目前,所有现有的 BiomSearchJobs 隐含地具有 default= 术语中列出的三个分类级别(用户无法选择),因此在数据库。运行migrate后,我发现之前的jobs并没有立即拥有三个taxonomy level关系,它们在调用job.taxonomy_levels.all()时只返回一个空集(如果 jobBiomSearchJob 的实例)。

有没有一种方法可以追溯添加这种关系而无需手动检查所有内容?理想情况下,通过运行 migrate 我希望现有的 BiomSearchJobs 具有 phylumclass taxonomy_levels 属性中列出的属

最佳答案

我认为您正在寻找数据迁移,这是一种允许对数据库进行仅数据更改的迁移。

你可以这样创建它:

python manage.py makemigrations <your app> --name=retroactively_add_levels

然后将这段代码插入刚刚创建的迁移文件中:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations


def add_taxonomy_levels(apps, schema_editor):
BiomSearchJob = apps.get_model('<your app>', 'BiomSearchJob')
TaxonomyLevelChoice = apps.get_model('<your app>', 'TaxonomyLevelChoice')
for job in BiomSearchJob.objects.all():
for choice in TaxonomyLevelChoice.objects.filter(taxon_level_proper_name__in=["phylum", "class", "genus"]):
job.taxonomy_levels.add(choice)

class Migration(migrations.Migration):

dependencies = []

operations = [
migrations.RunPython(add_taxonomy_levels, reverse_code=migrations.RunPython.noop)
]

它的工作方式与 SQL 查询非常相似,但它利用了 Django ORM。

希望这对您有所帮助。

关于python - 将新的 ManyToManyField 默认值追溯设置为现有模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com