我正在使用连接到我的Django项目的AS400系统中的旧数据库。我正在尝试以最佳方式配置我的模型并正确设置关系,但是我遇到了与添加具有外键字段的模型实例有关的问题然而。
这是一个示例,请考虑以下两个模型:
class CLIENTPF(models.Model):
id = models.BigAutoField(db_column='CLNTID', primary_key=True)
fname = models.CharField(db_column='CLNTFNAME', max_length=30, unique=True, null=True)
lname = models.CharField(db_column='CLNTLNAME', max_length=30)
dob = models.CharField(db_column='CLNTDOB', max_length=10)
class Meta:
managed = False
db_table = '"XPFLORIS"."CLIENTPF"'
class MOVIEPF(models.Model):
movie_name = models.CharField(db_column='MOVNAME', max_length=30, primary_key=True)
star_fname = models.ForeignKey(CLIENTPF, to_field='fname', on_delete=models.PROTECT, db_column='STARACTF', max_length=30)
star_lname = models.CharField(db_column='STARACTL', max_length=30)
genere = models.CharField(db_column='GENERE', max_length=30)
release_date = models.CharField(db_column='RELDATE', max_length=10)
class Meta:
managed = False
db_table = '"XPFLORIS"."MOVIEPF"'
MOVIEPF中的"star_fname"字段是CLIENTPF中"fname"字段的外键。因此,如果我想在视图中的MOVIEPF表中添加一个实例。
new_movie = MOVIEPF(movie_name="Johnny English", star_fname="Rowan", star_lname="Atkinson", genere="Comedy", release_date="02/12/2003")
new_movie.save()
相反,此代码将有效:
new_movie = MOVIEPF(movie_name="Johnny English", star_fname=CLIENTPF.objects.get(id=0), star_lname="Atkinson", genere="Comedy", release_date="02/12/2003")
new_movie.save()
但是,我的问题是,我想将一个实例添加到MOVIEPF,即使没有使用此"fname"的CLIENTPF实例,"star_fname"字段值即使没有CLIENTPF实例,但是一旦将其添加到CLIENTPF中,它将其添加到CLIENTPF中,并在"fname"中使用相应的名称添加了一个实例场地。
有人知道这是否可能吗?有一个解决方法,但它不需要在我的模型中使用这些关系字段属性,例如外国钥匙,我想在可能的情况下利用这些属性,因为这会使我的ORM查询更加有效。
分析解答
but the instance of that model might not exist yet.
如果您不确定CLIENTPF
实例的存在,并且它阻止了您创建MOVIEPF
实例,则可以将null=True
设置为star_fname
字段到所有NULL字段,或者您需要在填充MOVIEPF
之前创建CLIENTPF
的实例:
client = CLIENTPF.objects.filter(fname="Rowan").first()
if client is None:
client = CLIENTPF.objects.create(fname="Rowan", lname="David", dob="02/12/2003")
new_movie = MOVIEPF(movie_name="Johnny English", star_fname=client, star_lname="Atkinson", genere="Comedy", release_date="02/12/2003")
new_movie.save()
我认为除了上面以外,没有其他方法可以创建相关模型。