Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Django中具有相同属性的另一个模型创建对象_Python_Django_Inheritance_Django Models - Fatal编程技术网

Python 如何使用Django中具有相同属性的另一个模型创建对象

Python 如何使用Django中具有相同属性的另一个模型创建对象,python,django,inheritance,django-models,Python,Django,Inheritance,Django Models,是否可以使用另一个模型具有相同属性的对象创建对象 在我的例子中,我有两个模型-TemporaryJob和Job。临时工单是在用户填写表单时创建的。下一件事是确认。如果他确认了临时作业,则该对象应转换为常规作业对象 class Job(models.Model): attributes methods class TemporaryJob(Job): pass 我尝试了Job.objects.create(临时的\u Job\u实例),但它不起作用。首先,Klaus D

是否可以使用另一个模型具有相同属性的对象创建对象

在我的例子中,我有两个模型-
TemporaryJob
Job
临时工单
是在用户填写表单时创建的。下一件事是确认。如果他确认了
临时作业
,则该对象应转换为常规
作业
对象

class Job(models.Model):
    attributes
    methods

class TemporaryJob(Job):
    pass

我尝试了
Job.objects.create(临时的\u Job\u实例)
,但它不起作用。

首先,Klaus D。评论是正确的:我也不认为你的设计是正确的。与具有类似字段的
Job
TemporaryJob
模型不同,您应该只拥有一个
Job
模型,该模型具有一个布尔值
is_temporary
字段,如果不是,该字段将为
True
。如果这样做,就不需要在表之间复制值。如果您有标准化的数据,您将遇到的所有其他问题将更容易解决

在任何情况下,要真正回答您的问题,请注意
objects.create()
正在使用kwargs(即应该像
Job.objects.create(attr1=val1,att2=val2)那样调用它)
等。输出这些kwargs的最佳方法是创建一个包含要传递的对象值的字典(使用解包语法(
**
)将
临时作业实例的值传递给
创建
)。因此,如果
是包含
临时作业实例
值的字典,您可以调用
作业对象。创建(**值)


现在,您只需要从您的
临时作业\u实例创建
dict即可。不幸的是,在django中没有简单的方法可以做到这一点:(这是可以做到的——你可以看看这些问题,以获得一些见解和很多解决方法:或者这

首先,克劳斯D。评论是正确的:我也不认为你的设计是正确的。你应该只有一个
作业,而不是类似字段的
作业和
临时作业
模型
模型有一个布尔值
是临时的
字段,该字段将是
真的
,如果不是,则为
假的
。如果这样做,则不需要在表之间复制值。如果有标准化的数据,则会更容易解决所有其他问题

在任何情况下,要真正回答您的问题,请注意
objects.create()
正在使用kwargs(即应该像
Job.objects.create(attr1=val1,att2=val2)那样调用它)
等。输出这些kwargs的最佳方法是创建一个包含要传递的对象值的字典(使用解包语法(
**
)将
临时作业实例的值传递给
创建
)。因此,如果
是包含
临时作业实例
值的字典,您可以调用
作业对象。创建(**值)


现在,您只需要从您的
临时作业\u实例创建
dict即可。不幸的是,在django中没有简单的方法可以做到这一点:(这是可以做到的——你可以看看这些问题,了解一些见解和很多解决方法:或者这就是我所做的。如果你保留你的临时工作,可能会很糟糕,所以不要这样做

a_dict = temporary_job_instance.__dict__
del a_dict['_state']
del a_dict['id']
Job.objects.create(**a_dict)

这就是我所做的。如果你保存你的临时工作,可能会很糟糕,所以不要这样做

a_dict = temporary_job_instance.__dict__
del a_dict['_state']
del a_dict['id']
Job.objects.create(**a_dict)

为什么不直接使用
confirfied
属性呢?因为有一个信号表明作业已经创建,它会向管理员发送电子邮件。所以在这种情况下,管理员会在创建未确认的作业后收到电子邮件。好吧,这是一个信号处理的问题。你能用信号或其他什么实现这一点吗?@GaneshJadhav我不记得了,但我想@Serafeims的答案值得一读。为什么不使用
confirfied
属性呢?因为有一个信号表明已经创建了作业,它会向管理员发送电子邮件。所以在这种情况下,管理员会在创建未经确认的作业后收到电子邮件。好吧,这是一个信号处理的问题。您是否能够使用信号或其他方式实现这一点?@GaneshJadhav我不记得了,但我认为@Serafeims的答案值得一读。