Django:如何在不同的app / model中创建记录,保存当前模型中的数据

时间:2017-08-20 13:59:00

标签: django

以下是我的应用和各自的型号:

项目名称:django03

app:home

主/ model.py

from __future__ import unicode_literals

from django.db import models
from django.conf import settings
# Create your models here.

User = settings.AUTH_USER_MODEL

HOME_TYPE = (
    ('1','1'),
    ('2','2'),
    ('3','3'),
)


class Home(models.Model):
    home_owner = models.ForeignKey(User,null=False, verbose_name='Owner')
    hometype= models.CharField(max_length=100, null=False, default=1, 
choices=HOME_TYPE, verbose_name='Home Type')
    licenseid= models.CharField(max_length=200, null=False, unique=True, 
verbose_name='License ID')
archive = models.BooleanField(default=False)

def __str__(self):
    return self.licenseid

app:家具家具/ model.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.conf import settings
from django.db import models

# Create your models here.

User = settings.AUTH_USER_MODEL

FURNITURE_DATA_IMPORT_SOURCE= (
    ('0', '0'),
    ('1', '1'),
    ('2', '2'),
)

class Furniture(models.Model):
    furniture_owner = models.ForeignKey(User, verbose_name='User')
    furniture_imported_via = models.CharField(max_length=200, default="0", null=False, choices=FURNITURE_DATA_IMPORT_SOURCE, verbose_name='Source of import')
    furniture_title = models.CharField(max_length=100, null=False, verbose_name='Furniture title')
    furniture_description = models.TextField(max_length=250, verbose_name='Furniture description')
    archive = models.BooleanField(default=False)

    def __str__(self):
        return self.furniture_title

应用:映射映射/ model.py

from __future__ import unicode_literals

from django.db import models
from home.models import Home
from furniture.models import Furniture

class HomeFurnitureMapping(models.Model):
    home = models.OneToOneField(
        Home,
        on_delete=models.CASCADE,
        null=False,
        unique=True,
        verbose_name='Home'
    )
    furniture = models.OneToOneField(
        Furniture,
        on_delete=models.CASCADE,
        null=False,
        unique=True,
        verbose_name='Furniture'
    )

app:furnitureupdates furnitureupdates / model.py

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

from django.db import models
from mappings.models import HomeFurnitureMapping
# Create your models here.

class FurnitureUpdate(models.Model):
    mapping_id = models.OneToOneField(
        HomeFurnitureMapping,
        on_delete=models.CASCADE,
        null=False,
        unique=True,
        verbose_name='Mapping ID'
         )
    update_status = models.IntegerField(null=False, default=1)
    update_date = models.DateField(auto_now_add=True, null=False, verbose_name='Update date')
    update_time = models.TimeField(auto_now_add=True, null=False, verbose_name='Update time')

    def __str__(self):
        return self.mapping_id

我的问题是:

  1. 如何在管理面板中保存/更新“家具”表单后,在“FurnitureUpdate”表中创建/更新记录?

    < / LI>
  2. 在我从管理面板保存/更新“HomeFurnitureMapping”表单后,如何在“FurnitureUpdate”表中创建/更新记录

  3. 如果我使用 django-excel (如批量数据上传软件包),是否可以保留更新“FurnitureUpdate”表格的功能?

  4. 更新

    我通过在“HomeFurnitureMapping”类中添加方法尝试了django信号:

    # method for updating
    
    def update_on_home_furniture_mapping(sender, instance, **kwargs):
        print ('ENTERED')
        print(instance.id)
        m_id = instance.id
        from updates.models import FurnitureUpdate
        FurnitureUpdate.objects.create(mapping_id = m_id)
        print ('Furniture Update created!')
    
        # register the signal
    post_save.connect(update_on_tag_product_mapping, sender= HomeFurnitureMapping)
    

    但是我在管理面板中提交表单时出现以下错误。

    Error: "FurnitureUpdate.mapping_id" must be a "HomeFurnitureMapping" instance.
    

1 个答案:

答案 0 :(得分:0)

您删除ID时的最后一次错误修复: 取代

FurnitureUpdate.objects.create(mapping_id = m_id)

FurnitureUpdate.objects.create(mapping_id = instance)

默认情况下,db django将_id添加到列的名称中,在您的情况下,数据库中的列最后看起来像COLUMN_NAME_id_id double id,所以如果要将外键发送为整数您需要使用双_id_id,但对于单_id,您需要发送一个实例。