2017-01-19 4 views
1

У меня есть доступ для чтения к SQL-устаревшей БД. Предположим, что в БД есть две таблицы: Лечение и лечение Тип. В таблице лечения у меня есть patientID (int), date (text), treatmentType (int). В таблице TreatmentType у меня есть code(int) and meaning (Text). Treatment.treatmentType - это код для поиска , что означает в таблице TreatmentType.Как подключить поля в Сериализаторе (DjangoRestFramework)?

Во время первой миграции, я использую встроенный метод: inspectdb из django, и я получаю что-то вроде этого:

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' 

Из модели, я хочу иметь REST API для получения списка лечения дополнительной колонкой TreatmentMeaning. Я использую DjangoRestFramework создать сериализаторы для меня:

class TreatmentModelSerializer(serializers.ModelSerializer): 
    meaning = serializers.SerializerMethodField('get_meaning') 

    def get_meaning(self, instance): 
     meaning = TreatmentType.objects.get(code=instance.treatmenttype).meaning 
     return meaning 

    class Meta: 
     model = Treatment 
     fields = [ 
      'patient', 
      'date', 
      'meaning', 
     ] 

Он отлично работает. но я немного скептически отношусь к этому. Есть ли другие альтернативные способы сделать это правильно (более эффективным способом)?

Спасибо!

ответ

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.

+0

К сожалению, я не могу сделать что-то подобное. Обе они не связаны таблицей в БД ... Означает ли это, что я могу только присоединиться к ним вручную @ Даниэль Роземан? –

+0

Я не знаю, что вы имеете в виду. Если 'TREATTYPE' является целым числом, представляющим соответствующую строку в таблице TreatmentType, это внешний ключ. –

+0

Ahh, как я могу указать, что соответствующее поле не является 'index', а поле' code'? –

Смежные вопросы