[英]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”字段,并且模板代码无效。
我听说我需要使用RunPython
或manage.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.