Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 使用原始SQL注释QuerySet_Django - Fatal编程技术网

Django 使用原始SQL注释QuerySet

Django 使用原始SQL注释QuerySet,django,Django,如果我问错了问题,让我首先说明最终目标:我需要允许用户按不在主模型(Salesleadquote)中的字段筛选ListView,但该字段来自一个带有FK的模型(Salesleadbusinessgroup)和一个相关模型(Saleslead)。 我尝试的方法是在Salesleadquote上注释一个字段 模型: class Salesleadquote(models.Model): salesleadquoteid = models.AutoField(db_column='SalesL

如果我问错了问题,让我首先说明最终目标:我需要允许用户按不在主模型(Salesleadquote)中的字段筛选ListView,但该字段来自一个带有FK的模型(Salesleadbusinessgroup)和一个相关模型(Saleslead)。 我尝试的方法是在Salesleadquote上注释一个字段

模型:

class Salesleadquote(models.Model):
    salesleadquoteid = models.AutoField(db_column='SalesLeadQuoteId', primary_key=True) 
    salesleadid = models.ForeignKey(Saleslead, models.DO_NOTHING, db_column='SalesLeadId')
    ...
class Saleslead(models.Model):
    salesleadid = models.AutoField(db_column='SalesLeadId', primary_key=True)
    ...
class Salesleadbusinessgroup(models.Model):
    salesleadbusinessgroupid = models.AutoField(db_column='SalesLeadBusinessGroupId', primary_key=True) 
    salesleadid = models.ForeignKey(Saleslead, models.DO_NOTHING, db_column='SalesLeadId')
    businessgroupid = models.ForeignKey(Businessgroup, models.DO_NOTHING, db_column='BusinessGroupId') 
所需结果(queryset),在SQL中:

我知道我可以通过做这样的事情来获得一个RawQuerySet

 Salesleadquote.objects.raw("SELECT salesleadquote.*, \
                salesleadbusinessgroup.businessgroupid \
                FROM salesleadquote \
                LEFT JOIN salesleadbusinessgroup \
                ON salesleadquote.salesleadid = salesleadbusinessgroup.salesleadid \
                WHERE salesleadbusinessgroup.businessgroupid IN (5,21)")

但是我需要QuerySet的功能,所以我的想法是在Salesleadquote中注释所需的字段(businessgroupid),但我一直在努力实现这一点。

我实施了一个解决方案,它不解决我最初的问题,但适用于我的用例。我使用我发布的SQL在数据库级别创建了一个视图(称为SalesLeadQuoteBG),然后将其绑定到一个模型上,用于Django的ORM

class Salesleadquotebg(models.Model):
    """
    This model represents a database view that extends the Salesleadquote table with a business group id column.
    There can be multiple business groups per quote, resulting in duplicate quotes, but this is handled at the view and template layer
    via filtering (users are required to select a business group).
    """
    salesleadquoteid = models.IntegerField(db_column='SalesLeadQuoteId', primary_key=True)  # Field name made lowercase.
    salesleadid = models.ForeignKey(Saleslead, models.DO_NOTHING, db_column='SalesLeadId')  # Field name made lowercase.
    ...
    businessgroupid = models.ForeignKey(Businessgroup, models.DO_NOTHING, db_column='BusinessGroupId')
我使用django过滤器进行过滤

filters.py:

BG_CHOICES = (
                (5, 'Machine Vision'),
                (21, 'Process Systems'),
             )
class BGFilter(django_filters.FilterSet):
    businessgroupid = django_filters.ChoiceFilter(choices=BG_CHOICES)
    class Meta:
        model = Salesleadquotebg
        fields = ['businessgroupid', ]

这可以用纯Django ORM实现。关系可以向后跟踪(在
salesleadbusinessgroup
上过滤),双下划线语法可以用于查询相关模型的属性,也可以跟踪更多关系

Salesleadquote.objects.filter(
    salesleadbusinessgroup__businessgroupid__in=(5,21)
)
Salesleadquote.objects.filter(
    salesleadbusinessgroup__businessgroupid__in=(5,21)
)