繁体   English   中英

Django中OneToOneField的数据迁移

[英]Data migrations for OneToOneField in django

我有一个产品模型,我想通过使用OneToOneField进行扩展。

例如

class Product:
    name = models.CharField(..)
    price = models.FloatField(...)

我想这样

class MyProduct:
    product = models.OneToOneField(myapp.Product, on_delete=models.CASCADE)
    location = models.CharField(...)

并使用信号

def create_myproduct(sender, instance, created, **kwargs):
    """Create MyProduct class for every new Product"""
    if created:
        MyProduct.objects.create(product=instance)

signals.post_save.connect(create_myproduct, sender=Product, weak=False,
                          dispatch_uid='models.create_myproduct')

这适用于新创建的产品,因此我可以在模板中这样做。

{{ product.myproduct.location }}

但是在添加此OneToOneRelation之前创建的旧产品中没有“ myproduct”字段,并且模板代码无效。

我听说我需要使用RunPythonmanage.py shell对旧产品进行数据迁移。 你能教我怎么做吗? 我阅读了django的文档,但仍然不完全了解。

您应该以正常方式迁移模型

python manage.py makemigrations
python manage.py migrate 

在进行迁移期间,系统将询问您如何为现有数据填写新字段

请注意,当您使用1.7以下版本的Django时,您没有迁移权限(并且syncdb将无法完成现有表的工作)-请考虑使用第3部分工具,例如south

您可以添加新的迁移。 并应用它。 像这样的代码:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-07-22 06:04
from __future__ import unicode_literals

from django.db import migrations, models


def create_myproducts(apps, schema_editor):
    Product = apps.get_model('myapp', 'Product')
    MyProduct = apps.get_model('myapp', 'MyProduct')
    for prod in Product.objects.all():
        MyProduct.objects.create(product=prod)


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', 'your last migration'),
    ]

    operations = [
        migrations.RunPython(create_myproducts)
    ]

我才知道。

就像Rohit Jain所说的product.myproduct是None。

当我尝试访问product.myproduct时,出现了一个异常,即该对象不存在。 它与myproduct有关系,但实际对象不存在。

我真正想要的是创建MyProduct对象并将其添加到Product类。

所以我在python manage.py shell中做到了

products = Product.objects.all()
for prod in products:
    if not hasattr(prod, 'myproduct'):
        prod.myproduct = MyProduct.objects.create(product=prod)
        prod.save()

我认为它现在对我有用。

感谢大伙们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM