python - 在派生字段上查询 Django

标签 python django django-models django-queryset

使用 Django 1.8

我有一个指向数据库中 View 的非托管模型,并且我正在尝试返回基于派生字段的查询集。

这是模型结构的基本示例:

class Book(models.Model):
    book_id = models.IntegerField()
    publisher = models.CharField(max_length=20, null=True) # Can join to Publisher.publisher_name
    sku = models.CharField(max_length=15, null=True) # Can join to Sku.sku

    class Meta:
        managed = False
        db_table = 'vw_book'


class Sku(models.Model):
    sku = models.CharField(max_length=15)
    publisher = models.ForeignKey('myapp.Publisher')


class Publisher(models.Model):
    publisher_name = models.CharField(max_lenth=20)
    region = models.ForeignKey('myapp.Region')


class Region(models.Model):
    region_name = models.CharField(max_length=20)

我正在寻找一种方法来返回基于区域的图书查询集,该查询集源自作为首选字段的出版商,然后是 sku。 Book 中的这些字段可能引用不同的区域字段,因为数据是未知的并且来自多个源。我可以向 Book 模型添加一个方法来派生区域,但尝试从中获取查询集太慢了。

class Book(models.Model):
    publisher = models.CharField(max_length=20, null=True)
    sku = models.CharField(max_length=15, null=True)

    class Meta:
        managed = False
        db_table = 'vw_book'

    def get_region(self):
        if not self.publisher:
            if not self.sku:
                return ''
            try:
               sku = Sku.objects.get(sku=self.sku)
               return sku.publisher.region.region_name
            except Sku.DoesNotExist:
               return ''
         try:
             publisher = Publisher.objects.get(publisher_name=self.publisher)
             return publisher.region.region_name
         except Publisher.DoesNotExist:
             return ''


region_dict = {}
for book in Book.objects.all():
    region_dict.setdefault(book.get_region(), []).append(book.book_id)

Book.objects.filter(book_id__in=region_dict.get('UK', []))

我无法向 Book 模型添加额外的字段。有没有更有效的方法可以做到这一点?

最佳答案

我会过滤 sku,然后根据您收到的 sku 过滤书籍

skus = Sku.objects.filter(publisher__region__region_name=region).values_list('sku', flat=True)
Book.objects.filter(sku__in=skus)

如果需要,您可以对发布商执行相同的操作并执行“或”查询。

 .filter(Q(publisher__in=publishers) |Q(sku__in=skus))

关于python - 在派生字段上查询 Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55853774/

相关文章:

python - 如何过滤 pandas 数据框以便保留组中的第一行和最后一行?

python - 如何将图像渲染到模板?

Django 集成与 Mako Jinja2 模板比较使用 : render_to_response. 问题?

django 调试工具栏无法从虚拟机上的静态 IP 运行

django - 如何在 Django 中创建一个 numpy 数组字段?

python - Django ManyToManyField 中的 'through' 参数是否包含所有字段?

python - 如何在 emacs 中激活 ananconda 的 env python?

python - Matplotlib 的 Axes3D 绘图不直观吗?

python - 看起来相似的 Python for 循环之间的区别?

django - 在 Django 中将计算值从 View 保存到模型