如何在 Django 中使用左外连接?
How to use left outer join in django?
我有两个模型
class Business(models.Model):
BID = models.IntegerField(primary_key=True, default=datetime.now().strftime("%d%y%H%S%m%M%f"))
BusinessName = models.CharField(max_length=150)
ContactPerson = models.CharField(max_length=50)
class BusinessComment(models.Model):
BID = models.ForeignKey(Business, blank=True, null=True)
Rating = models.IntegerField(blank=True, null=True)
Comment = models.TextField(blank=True, null=True)
class BusinessHours(models.Model):
BID = models.ForeignKey(Business, blank=True, null=True)
Day = models.IntegerField(blank=True, null=True)
StartHour = models.CharField(max_length=8, blank=True, null=True)
EndHour = models.CharField(max_length=8, blank=True, null=True)
我想在单个对象中访问低于两个值的值 models.this 概念是左外连接,但我可以在具有以下所有值的单个对象中实现吗?
BID,BusinessName,ContactPerson,AVG(Rating),Count(Number of Comment) (Condition is Business.BID = BusinessComment.BID)
业务Table数据
BID BusinessName ContactPerson
1 First First
2 Second Second
营业时间Table数据
id BID Rating Comment
1 1 3 Comment1
2 1 5 Comment2
3 2 4 Comment3
4 2 5 Comment4
那么结果应该在 Object As:
BID Businame ContactPerson Rating Comment
1 First First 4 2
2 Second Second 4.5 2
我已经试了很多次了,但是我做不到that.P
编辑:
today = datetime.datetime.today().weekday() + 1
营业时间Table数据
id BID Day Stathours EndHour
145 1 1 12:00am 12:00am
146 1 2 Closed Closed
147 1 3 12:00am 12:00am
148 1 4 Closed Closed
149 1 5 12:00am 12:00am
150 1 6 12:00am 12:00am
151 1 7 12:00am 12:00am
152 2 1 12:00am 12:00am
153 2 2 12:00am 12:00am
154 2 3 12:00am 12:00am
155 2 4 12:00am 12:00am
156 2 5 12:00am 12:00am
157 2 6 12:00am 12:00am
158 2 7 12:00am 12:00am
现在我想使用 filter(BusinessHours.Day = today)
和 annotate.So 从 BusinessHours 过滤数据,输出如下。
BID Businame ContactPerson Rating Comment StartHour EndHours
1 First First 4 2 12:00am 12:00pm
2 Second Second 4.5 2 12:00am 12:00pm
StartHour 和 EndHour 是当前日期的给定值。
您可以使用 annotation with aggregation:
from django.db.models import Count, Avg
qs = Business.objcts.annotate(comment_count=Count('businesscomment'),
avg_rating=Avg('businesscomment__rating'))
然后在查询集中您可以访问 comment_count
或 avg_rating
:
# I am using these fields in values_list for example
qs.values_list('BID', 'BusinessName', 'ContactPerson', 'comment_count', 'avg_rating')
我有两个模型
class Business(models.Model):
BID = models.IntegerField(primary_key=True, default=datetime.now().strftime("%d%y%H%S%m%M%f"))
BusinessName = models.CharField(max_length=150)
ContactPerson = models.CharField(max_length=50)
class BusinessComment(models.Model):
BID = models.ForeignKey(Business, blank=True, null=True)
Rating = models.IntegerField(blank=True, null=True)
Comment = models.TextField(blank=True, null=True)
class BusinessHours(models.Model):
BID = models.ForeignKey(Business, blank=True, null=True)
Day = models.IntegerField(blank=True, null=True)
StartHour = models.CharField(max_length=8, blank=True, null=True)
EndHour = models.CharField(max_length=8, blank=True, null=True)
我想在单个对象中访问低于两个值的值 models.this 概念是左外连接,但我可以在具有以下所有值的单个对象中实现吗?
BID,BusinessName,ContactPerson,AVG(Rating),Count(Number of Comment) (Condition is Business.BID = BusinessComment.BID)
业务Table数据
BID BusinessName ContactPerson
1 First First
2 Second Second
营业时间Table数据
id BID Rating Comment
1 1 3 Comment1
2 1 5 Comment2
3 2 4 Comment3
4 2 5 Comment4
那么结果应该在 Object As:
BID Businame ContactPerson Rating Comment
1 First First 4 2
2 Second Second 4.5 2
我已经试了很多次了,但是我做不到that.P
编辑:
today = datetime.datetime.today().weekday() + 1
营业时间Table数据
id BID Day Stathours EndHour
145 1 1 12:00am 12:00am
146 1 2 Closed Closed
147 1 3 12:00am 12:00am
148 1 4 Closed Closed
149 1 5 12:00am 12:00am
150 1 6 12:00am 12:00am
151 1 7 12:00am 12:00am
152 2 1 12:00am 12:00am
153 2 2 12:00am 12:00am
154 2 3 12:00am 12:00am
155 2 4 12:00am 12:00am
156 2 5 12:00am 12:00am
157 2 6 12:00am 12:00am
158 2 7 12:00am 12:00am
现在我想使用 filter(BusinessHours.Day = today)
和 annotate.So 从 BusinessHours 过滤数据,输出如下。
BID Businame ContactPerson Rating Comment StartHour EndHours
1 First First 4 2 12:00am 12:00pm
2 Second Second 4.5 2 12:00am 12:00pm
StartHour 和 EndHour 是当前日期的给定值。
您可以使用 annotation with aggregation:
from django.db.models import Count, Avg
qs = Business.objcts.annotate(comment_count=Count('businesscomment'),
avg_rating=Avg('businesscomment__rating'))
然后在查询集中您可以访问 comment_count
或 avg_rating
:
# I am using these fields in values_list for example
qs.values_list('BID', 'BusinessName', 'ContactPerson', 'comment_count', 'avg_rating')