我正在使用连接到我的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()

我认为除了上面以外,没有其他方法可以创建相关模型。