gpt4 book ai didi

django - 我们如何计算django中相关表中日期时间字段的平均差异?

转载 作者:行者123 更新时间:2023-12-04 14:03:09 29 4
gpt4 key购买 nike

我有两个型号 演出 订单 .
并想计算 之间差异的平均值order_start_time 订单完成时间每场演出。检查我的代码它给出以下错误
无法将关键字“订单”解析为字段。选项有:category、category_id、details、gig、id、images、price、reviews、seller、seller_id、title
请帮忙!
模型.py (在卖家应用中)

class Gigs(models.Model):
title = models.CharField(max_length=255)
category = models.ForeignKey(Categories , on_delete=models.CASCADE)
images = models.ImageField(blank=True, null = True, upload_to= upload_path)
price = models.DecimalField(max_digits=6, decimal_places=2)
details = models.TextField()
seller = models.ForeignKey(User,default=None, on_delete=models.CASCADE)

@property
def average_completionTime(self):
if self._average_completionTime is not None:
return self._average_completionTime
return self.gig.aggregate(Avg('order_completed_time'-'order_start_time'))
我认为这里的问题在于平均完成时间如何在我应该在 views.py 中引用的一个变量中使用 'order_completed_time'-'order_start_time'
模型.py (在买家应用中)
专注于项目领域
from seller.models import Gigs
class Orders(models.Model):
buyer = models.ForeignKey(User,default=None, on_delete=models.CASCADE,related_name='buyer_id')
seller = models.ForeignKey(User,default=None, on_delete=models.CASCADE,related_name='seller_id')
item = models.ForeignKey(Gigs,default=None, on_delete=models.CASCADE,related_name='gig')
payment_method= models.CharField(max_length=10)
address = models.CharField(max_length=255)
mobile = models.CharField(max_length=13,default=None)
quantity = models.SmallIntegerField(default=1)
status = models.CharField(max_length=13,default='new order')
order_start_time = models.DateTimeField(default=None)
order_completed_time = models.DateTimeField(default=None)
created_at = models.DateTimeField(auto_now_add=True)
Views.py
class RetrieveGigsAPI(GenericAPIView, RetrieveModelMixin):
def get_queryset(self):
return Gigs.objects.all().annotate(_average_rating=Avg('orders__time'))
serializer_class = GigsSerializerWithAvgTime
permission_classes = (AllowAny,)

def get(self, request , *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
Serializers.py
class GigsSerializerWithAvgTime(serializers.ModelSerializer):
average_completionTime = serializers.SerializerMethodField()
def get_average_completionTime(self, obj):
return obj.average_completionTime
class Meta:
model = Gigs
fields = ['id','title','category','price','details','seller','images','average_completionTime']

最佳答案

您可以使用平均完成时间来注释每个演出,如下所示:

    def get_queryset(self):
return Gigs.objects.annotate(
_average_completionTime=Avg(
F('gig__order_completed_time') - F('gig__order_start_time')
)
)
在您的 average_completionTime模型方法,你还需要使用 F表达式 if self._average_completionTime不是这样设置的:
    @property
def average_completionTime(self):
if getattr(self, '_average_completionTime', None):
return self._average_completionTime
return self.gig.aggregate(Avg(F('order_completed_time') - F('order_start_time')))
更新 :
我无法重现 'decimal.Decimal' object has no attribute 'tzinfo'错误。
不知道为什么,但基于 this 回答,你可以试试用 ExpressionWrapper 为了避免同样的错误,所以:
from django.db.models import DurationField, ExpressionWrapper, F


class GigsSerializerWithAvgTime(serializers.ModelSerializer):
def get_queryset(self):
return Gigs.objects.annotate(
_average_completionTime=Avg(
ExpressionWrapper(F('gig__order_completed_time') - F('gig__order_start_time'), output_field=DurationField())
)
)
或者正如@Abdul Aziz Barkat 提到的,添加 output_fieldAvg像这样聚合:
        return Gigs.objects.annotate(
_average_completionTime=Avg(
F('gig__order_completed_time') - F('gig__order_start_time'), output_field=DurationField()
)
)

关于django - 我们如何计算django中相关表中日期时间字段的平均差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69351271/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com