使用 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/