Как вычислить среднее значение разницы полей даты и времени в моделях Django и отправить его в rest API?

У меня есть две модели Gigs и Orders. и я хочу вычислить среднее значение разницы между временем начала_заказа и временем завершения_заказа каждого концерта. проверьте мой код, он выдает следующую ошибку

Не удается подобрать ключевое слово 'orders' к полю. Варианты: category, category_id, details, gig, id, images, price, reviews, seller, seller_id, title

прошу помощи!

Models.py (in seller app)

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'))

Models.py(in buyer app)

фокус на поле элемента

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']

Вы можете добавить свойство completion_time к вашей модели Orders. Тогда вы сможете получить среднее время обработки для всех заказов, принадлежащих определенному гигу, используя сжатие списка в гигах

class Gigs(models.Model):

    @property
    def average_completion_time(self):
        """
        Returns the average completion time for all orders which belong to this class .
        """

        completion_times = [o.completion_time for o in Orders.objects.filter(gig=self)]
        return sum(completion_times) / float(len(completion_times))


class Orders(models.Model):
    gig = models.ForeignKey(Gigs, default=None, on_delete=models.CASCADE)
    order_start_time = models.DateTimeField(default=None)
    order_completed_time = models.DateTimeField(default=None)

    @property
    def completion_time(self):
        """
        Returns the completion time for this order in seconds
        """

        timediff = self.order_completed_time - self.order_start_time
        return timediff.seconds
Вернуться на верх