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的答案值得一读。