我对SQL-legacy DB具有读访问权限。假设在DB中我有两个表: Treatment和TreatmentType 。
在治疗表中,我有patientID (int), date (text), treatmentType (int)
。在TreatmentType表中,我有code(int) and meaning (Text)
。
Treatment.treatmentType 是用于在TreatmentType表中查找含义的代码。
在第一次迁移期间,我使用内置方法:来自inspectdb
的{{1}},我得到这样的内容:
django
从模型中,我希望有一个REST API,用于通过额外的列TreatmentMeaning获取治疗列表。我使用DjangoRestFramework为我创建序列化程序:
class TreatmentType(models.Model):
index = models.TextField(primary_key=True)
code = models.IntegerField(db_column='Code', blank=True, null=True) # Field name made lowercase.
meaning = models.TextField(db_column='Meaning', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'TreatmentType'
class Treatment(models.Model):
index = models.TextField(primary_key=True)
patient = models.IntegerField(db_column='PATIENT', blank=True, null=True) # Field name made lowercase.
date = models.TextField(db_column='DATE', blank=True, null=True) # Field name made lowercase. This field type is a guess.
treatmenttype = models.IntegerField(db_column='TREATTYPE', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'Treatment'
工作正常。但我对此有点怀疑。有没有其他替代方法可以正确地进行(以更有效的方式)?
谢谢!
答案 0 :(得分:1)
如前几条评论中所述,inspectdb
只是猜测。特别是它未能找到Treatment和TreatmentType之间的外键,因此您可以自己做出改变。
更新处理中的treatmenttype
字段,如下所示:
treatmenttype = models.ForeignKey('TreatmentType', db_column='TREATTYPE', to_field='code', blank=True, null=True)
现在,除了能够在您自己的代码中自动关注该外键 - 例如通过my_treatment.treatmenttype.meaning
- 您可以使用序列化程序中的SlugRelatedField自动获取含义值:
class TreatmentModelSerializer(serializers.ModelSerializer):
treatmenttype = serializers.SlugRelatedField(read_only=True, slug_field='meaning'
还有一些其他字段类型需要更新; index
字段可能是AutoFields,date
应该是DateField。