Django Объединение нескольких комбинированных моделей

В настоящее время у меня возникла проблема, когда мои модели не соединяются по внешнему ключу должным образом,

Врачи могут иметь только один набор инструментов, по сути мне нужно вернуть [DoctorName, Category, Type, Subtype, Syringe, Bandage]

ToolSetCategoryID, ToolSetTypeID, ToolSetSubTypeID все присоединяются к соответствующим таблицам друг друга и все присоединяются обратно к ToolSets

.

примером моделей может быть:



class Doctor(models.Model):
    DoctorID = models.AutoField(db_column='DoctorID', primary_key=True)
    ToolSetID = models.ForeignKey("ToolSets", db_column='ToolSetID', on_delete=models.CASCADE)
    DoctorName = models.CharField(db_column='DoctorName', max_length=100)

    class Meta:
        managed = False
        db_table = 'tblDoctors'
        default_permissions = ['add','edit','delete']

class ToolSetCategories(models.Model):
    ToolSetCategoryID = models.AutoField(db_column='ToolSetCategoryID', primary_key=True)
    Category = models.CharField(db_column='Category', max_length=100)

    class Meta:
        managed = False
        db_table = 'tblToolSetCategories'
        default_permissions = ['add','edit','delete']

class ToolSetTypes(models.Model):
    ToolSetTypeID = models.AutoField(db_column='ToolSetTypeID', primary_key=True)
    ToolSetCategoryID = models.ForeignKey("ToolSetCategories",db_column='ToolSetCategoryID',on_delete=models.CASCADE)
    Type = models.CharField(db_column='Type', max_length=100)

    class Meta:
        managed = False
        db_table = 'tblToolSetTypes'
        default_permissions = ['add','edit','delete']

class ToolSetSubTypes(models.Model):
    ToolSetSubTypeID = models.AutoField(db_column='ToolSetSubTypeID', primary_key=True)
    ToolSetTypeID = models.ForeignKey("ToolSetTypes",db_column='ToolSetTypeID',on_delete=models.CASCADE)
    ToolSetCategoryID = models.ForeignKey("ToolSetCategories",db_column='ToolSetCategoryID',on_delete=models.CASCADE)
    SubType = models.CharField(db_column='SubType', max_length=100)
    
    class Meta:
        managed = False
        db_table = 'tblToolSetSubTypes'
        default_permissions = ['add','edit','delete']

class ToolSets(models.Model):
    ToolSetID = models.AutoField(db_column='ToolSetID', primary_key=True)
    
    ToolSetCategoryID = models.ForeignKey("ToolSetCategories",db_column='ToolSetCategoryID',on_delete=models.CASCADE)
    ToolSetTypeID = models.ForeignKey("ToolSetTypes",db_column='ToolSetTypeID',on_delete=models.CASCADE)
    ToolSetSubTypeID = models.ForeignKey("ToolSetSubTypes",db_column='ToolSetSubTypeID',on_delete=models.CASCADE)
    
    Syringe = models.CharField(db_column='Syringe', max_length=100)
    Bandage = models.CharField(db_column='Bandage', max_length=100)

    class Meta:
        managed = False
        db_table = 'tblToolSets'
        default_permissions = ['add','edit','delete']

Я нашел либо исправление, либо обходной путь.

Мне пришлось фильтровать условия, которые я бы использовал в соединении, вместо того, чтобы использовать соединение.

Вы можете использовать встроенную в Django функцию F для ссылки на динамические данные поля для фильтрации (например, фильтрация данных поля по данным другого поля).

Не самое лучшее решение, но пока работает, если кто-то может найти более эффективный способ сделать это, пожалуйста, опубликуйте ответ ниже.

from django.db.models import F
    Doctor.objects.using("test").filter(DoctorID=DoctorID).filter(
    ToolSetID__ToolSetTypeID__ToolSetCategoryID=F("ToolSetID__ToolSetCategoryID"),          
    ToolSetID__ToolSetSubTypeID__ToolSetTypeID=F("ToolSetID__ToolSetTypeID"),            
    ToolSetID__ToolSetSubTypeID__ToolSetCategoryID=F("ToolSetID__ToolSetCategoryID"),
) 
Вернуться на верх