我有这些模型:
class MyModel1(models.Model):
field1 = models.CharField(max_length=128, blank=True, null=True)
fieldrelated1 = models.OneToOneField('MyModel2', max_length=128, blank=True, null=True, related_name='mymodel2')
fieldrelated2 = models.OneToOneField('MyModel3', max_length=128, blank=True, null=True, related_name='mymodel3')
fieldrelated3 = models.OneToOneField('MyModel4', max_length=128, blank=True, null=True, related_name='mymodel4')
class MyModel2(models.Model):
field2 = models.CharField(max_length=128, blank=True, null=True)
myfk = models.ForeignKey(MyModel1, max_length=128, blank=True, null=True)
class MyModel3(models.Model):
field3 = models.CharField(max_length=128, blank=True, null=True)
test = models.CharField(max_length=128, blank=True, null=True)
class MyModel4(models.Model):
field4 = models.CharField(max_length=128, blank=True, null=True)
test = models.CharField(max_length=128, blank=True, null=True)
然后,这个方法:
def create_child_objects(instance, created, rad, **kwargs):
if not created or rad:
return
field1 = instance.field1
if not instance.fieldrelated1_id:
fieldrelated1, _ = MyModel2.objects.get_or_create(field1=field2)
instance.fieldrelated1 = fieldrelated1
if not instance.fieldrelated2_id:
fieldrelated2, _ = MyModel3.objects.get_or_create(field1=field3)
instance.fieldrelated2 = fieldrelated2
if not instance.fieldrelated3_id:
fieldrelated3, _ = MyModel4.objects.get_or_create(field1=field4)
instance.fieldrelated3 = fieldrelated3
instance.save()
models.signals.post_save.connect(create_child_records, sender=MyModel1, dispatch_uid='create_child_objects')
到目前为止,此方法用于保存父级并在子级创建时保存特定字段。
例如,当我想要将父母的CharField
保存到子CharField
中时,我希望将实际的父实例保存到子项的ForeignKey
字段中,我的问题就出现了,如下所示:
def create_child_objects(instance, created, rad, **kwargs):
if not created or rad:
return
field1 = instance.__str__
if not instance.fieldrelated1_id:
fieldrelated1, _ = MyModel2.objects.get_or_create(field1=myfk)
instance.fieldrelated1 = fieldrelated1
if not instance.fieldrelated2_id:
fieldrelated2, _ = MyModel3.objects.get_or_create(field1=field3)
instance.fieldrelated2 = fieldrelated2
if not instance.fieldrelated3_id:
fieldrelated3, _ = MyModel4.objects.get_or_create(field1=field4)
instance.fieldrelated3 = fieldrelated3
instance.save()
models.signals.post_save.connect(create_child_objects, sender=MyModel1, dispatch_uid='create_child_records')
父对象使用如下方法保存到db中:
def __str__(self):
return ('{}: {}: {}'.format(self.field1, self.field2, self.field3))
所以,在第二个create_child_objects
之后,它抛出了我:
TypeError at /admin/mymodel/instance/add/
int() argument must be a string, a bytes-like object or a number, not 'method'
那么,如何将父对象描述符保存到父对象的ForeignKey
字段中?
编辑
在这个myfk
字段上保存的是MyModel1
的id,所以,保存这个就足够了,但是当我尝试这样的时候field1 = MyModel1.id
它说:
ValueError at /admin/mymodel/instance/add/
Cannot assign "98": "MyModel2.field1.id" must be a "MyModel1" instance.
field1 = instance.__str__
改成
field1 = instance.__str__()
要么
field1 = str(instance)
qazxsw poi是一种方法,你的任务使qazxsw poi指向这个方法,而不是方法的结果。
所有__str__
线都错了:
field1
字段,所以正确的过滤器将是MyModel[2-4].objects.get_or_create(field1=field2)
field1
方法是这些ID的组合,这个字符串必须先解析;只有提取的值才匹配我不明白你的field[2-4]=field1
方法如何工作,因为这个模型没有__str__
,__str__
和field2
。
我建议你重新考虑这个方法。看看field3
。