Python3.6.1过滤多个对象和输入

2024-04-26 04:34:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,正在尝试从models类中过滤一些对象。 我已经成功地向系统添加了一个新订单,现在我想向请求的workers相关的service发送一个通知。示例:CustomerA在日期X向Y地址发送电工请求。在我的服务团队中,乔希和克里斯是机械师,阿诺德和大卫是电工。我想先过滤哪个worker覆盖了该服务(结果是Arnold和David),然后过滤他们的online_status。以下是我目前掌握的情况:

你知道吗型号.py你知道吗

class Service(models.Model): #electrician, mechanic, etc
  name = models.CharField(max_length=500)
  short_description = models.CharField(max_length=500)
  image = models.ImageField(upload_to='service_image/', blank=False)
  price = models.IntegerField(default=0)

  def __str__(self):
      return self.name

class Worker(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='worker')
  avatar = models.CharField(max_length=500)
  phone = models.CharField(max_length=500, blank=True)
  address = models.CharField(max_length=500, blank=True)
  service = models.ForeignKey(Service, blank=True, null=True)
  online_status = models.BooleanField(default=1) # 1=online OR 0=offline

  def __str__(self):
    return self.user.get_full_name()

class Order(models.Model):
  REQUESTED = 1
  ACCEPTED = 2
  DENIED = 3
  CANCELED = 4
  COMPLETED = 5

  STATUS_CHOICES = (
      (REQUESTED, "Requested"),
      (ACCEPTED, "Accepted"),
      (DENIED, "Denied"),
      (CANCELED, "Canceled"),
      (COMPLETED, "Completed"),
  )

  customer = models.ForeignKey(Customer)
  worker = models.ForeignKey(Worker, blank=True, null=True)
  address = models.CharField(max_length=500)
  total = models.IntegerField()
  status = models.IntegerField(choices = STATUS_CHOICES)
  created_at = models.DateTimeField(default = timezone.now)
  shot_issue_description = models.CharField(max_length=500)
  service_date = models.DateTimeField()

  def __str__(self):
      return str(self.id)

class OrderDetails(models.Model):
  order = models.ForeignKey(Order, related_name='order_details')
  service = models.ForeignKey(Service)
  sub_total = models.IntegerField()

  def __str__(self):
      return str(self.id)

这是我的函数,其中customer生成order

def customer_add_order(request):
"""
    INPUT FROM CUSTOMER:
        access_token
        service_date
        address
        shot_issue_description
        order_details (json format), example:
            {"service_id" : 1} >> Electrician
"""
  if request.method == "POST":
    # Get user token
    access_token = AccessToken.objects.get(token = request.POST.get("access_token")) #, expires__gt = timezone.now())
    # Get customer
    customer = access_token.user.customer

    # Check address
    if not request.POST["address"]:
        return JsonResponse({"status": "failed", "error": "Address is required."})

    # Check whether customer has any order that is not delivered
    # !!!!!!!!! check also if objects complete are the same service!!!!!!!!!
    if Order.objects.filter(customer = customer).exclude(status = Order.COMPLETED) or Order.objects.filter(customer = customer).exclude(status = Order.CANCELED):
        return JsonResponse({"status": "failed", "error": "Your last service is not completed or canceled yet."})

    # Get Order Details
    order_details = json.loads(request.POST["order_details"])
    shot_issue_description = request.POST["shot_issue_description"]
    order_total = Service.objects.get(id = order_details["service_id"]).price

    #____________Filter starts
    # filter workers by online_status
    #   ???

    # filter workers by service type
    #   ???

    #____________Filter ends

    if len(order_details) > 0:
        # Step 1 - Create Order
        order = Order.objects.create(
            customer = customer,
            address = request.POST["address"],
            service_date = request.POST["service_date"],
            total = order_total,
            shot_issue_description = shot_issue_description,
            status = Order.REQUESTED
        )
        # Step 2 - Create Order
        OrderDetails.objects.create(
            order = order,
            service_id = order_details["service_id"],
            sub_total = Service.objects.get(id = order_details["service_id"]).price
        )
        return JsonResponse({"status": "success"})

目前,我正在向系统添加一个订单,而不过滤工人。这样做的目的是,只有在有一个工人提供服务并且他在线的情况下,才能添加订单。谢谢你的帮助!你知道吗


Tags: selfidobjectsmodelsrequeststatusserviceorder