【问题标题】:Test a data migration ManyToMany in Django在 Django 中测试数据迁移 ManyToMany
【发布时间】:2022-07-22 08:33:40
【问题描述】:

我尝试在 Django 中向我的 ManyToMany 关系模型中添加一个字段。 因此,我一步一步地创建了新模型并应用了 makemigrations 和 migrate。 我检查了我的 postgresql 数据库中有新表。

现在,在我在 ManyToMany 字段中添加 through 关键字之前,我想在迁移文件中编写一个函数,将以前的 ManyToMany 表的旧数据复制到带有附加字段的新表中。

我遵循了此处解释的解决方案: Django migration error :you cannot alter to or from M2M fields, or add or remove through= on M2M fields

我想测试将在测试函数中迁移数据的函数,但我不明白该怎么做。

这是我的代码:

调查/模型:

class Survey(BaseModel):
    
    name = models.CharField(max_length=256, help_text='Survey name')
    user = models.ManyToManyField(User, blank=True, help_text='patient')

调查/模型:

class SurveyStatus(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    survey_status = models.CharField(max_length=10,
                                     blank=True,
                                     null=True,
                                     choices=STATUS_SURVEY_CHOICES,
                                     )

我写的需要将数据从之前的M2M复制到新的函数如下:

def create_through_relations(apps, schema_editor):
    Survey = apps.get_model('survey', 'Survey')
    SurveyStatus = apps.get_model('survey', 'SurveyStatus')
    for survey in Survey.objects.all():
        for user in survey.user.all():
            SurveyStatus(
                user=user,
                survey=survey,
                survey_status='active'
            ).save()
  1. 我不明白什么是应用程序?因为它不被python识别
  2. 我不明白为什么我需要 schema_editor,因为它没有被使用
  3. 它也无法识别我的 Survey 或 SurveyStatus 模型

当我尝试运行这个脚本时

if __name__ == "__main__":
    create_through_relations(survey)

我遇到了这个错误

NameError: 名称“调查”未定义

如果我尝试了这个功能

from django.apps import apps
def create_through_relations():
        Survey = apps.get_model('survey', 'Survey')
        SurveyStatus = apps.get_model('survey', 'SurveyStatus')
        for survey in Survey.objects.all():
            for user in survey.user.all():
                SurveyStatus(
                    user=user,
                    survey=survey,
                    survey_status='active'
                ).save()

当我尝试运行这个脚本时

if __name__ == "__main__":
    create_through_relations()

我遇到了这个错误

django.core.exceptions.AppRegistryNotReady:模型尚未加载。

如果有人可以帮助并解释我如何解决。谢谢

【问题讨论】:

    标签: django many-to-many django-migrations


    【解决方案1】:

    1:应用代表项目的不同部分 (Django Apps)

    2:此时您不需要它。通常,它将模型转换为 SQL 语法。

    3: python manage.py <...> 确实加载模型以供执行。您的文件尝试访问这样不可用的数据。

    4:变量 survey 在 python 的 main 函数中找不到,因为您从未在其中声明过它。你可以在你的项目中触发它。

    6:您可以通过创建 test.py (Django Tests) 来测试事物

    7:更改模型后无需将数据转移到全新的表中,只需扩展现有的并迁移更改即可:

    class BaseModel(models.Model):
    
        created = models.DateTimeField('created', default=timezone.now)
    
        changed = models.DateTimeField('changed', default=timezone.now, blank=True, null=True)
    
    
    class Survey(BaseModel):
    
        uuid = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False)
        
        name = models.CharField(max_length=256, help_text='Survey name')
    
        description = models.TextField('description', blank=True)
    
        status = models.BooleanField(default=False) # paused/ active
    
    
    class SurveyQuestion(BaseModel):
        
        survey = models.ForeignKey(Survey, related_name='survey', on_delete=models.CASCADE)
    
        text = models.CharField(max_length=256)
    
        # 1 -> Text, # Integer, # ChoiceField, etc.
        requested_result = models.IntegerField(default=0)
    
    
    class QuestionResult(BaseModel):
    
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    
        question = models.ForeignKey(SurveyQuestion, related_name='survey_question', on_delete=models.CASCADE)
    
        answer = models.CharField(default='', max_length=256)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多