Django多组合模型连接

发布于 2025-02-01 18:41:38 字数 2704 浏览 3 评论 0原文

目前遇到一个问题,我的模型无法正确加入外键,

医生只能有一个工具集,我需要返回[DoctorName,类别,类型,亚型,注射器,注射器,绷带]

toolsetCategoryId,toolsetTypeid,toolsetSubtypeid都在彼此的表上加入,所有这些都可以回到工具集

模型的示例是:



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']

Currently experiencing a problem where my models aren't joining on the foreign key properly,

Doctors can only have one toolset, essentially I need to return [DoctorName, Category, Type, Subtype, Syringe, Bandage]

ToolSetCategoryID, ToolSetTypeID, ToolSetSubTypeID all join on each other's respective tables and all join back to ToolSets

an example of the models would be:



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']

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半寸时光 2025-02-08 18:41:38

我找到了修复程序或解决方法。

我必须过滤连接中要使用的条件,而不是使用联接。

您可以使用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"),
) 

I've found either the fix or a workaround.

I had to filter the conditions I would've used in a join instead of using a join.

You can use Django's built in function F in order to reference a fields dynamic data to filter against (such as filtering field data against another field's data).

Not the best looking solution but is working for now, if anyone can find a more efficient way of doing this please post an answer below.

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"),
) 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文