简体   繁体   English

当在 django 中创建另一个模型对象时,我如何在模型名称上添加一个文件:''订单计数'

[英]how do i icrement a filed on a model name:''order count' when an another model object is created in django

I have two models Customer and Order and I want to make 3 fields that are updating when an Order object is created.我有两个模型CustomerOrder ,我想创建3 个在创建Order对象时更新的字段。 the fields are Order_Count:--, First_Order:order_date, Last_Order: order_date这些字段是Order_Count:--, First_Order:order_date, Last_Order: order_date

how do I do this?我该怎么做呢?

Customer model:客户型号:

class Customer(models.Model):
GENDER_CHOICES = (
    ('MALE', 'male'),
    ('FEMALE', 'female'),
    ('OTHER', 'other')
)
SOURCES = (
    ('android', 'Android'),
    ('ios', 'IOS')
)
customer = models.ForeignKey(User, related_name='customer', on_delete=models.CASCADE)
image = models.ImageField(upload_to='customer_images/', null=True, blank=True)
social_image_url = models.TextField(null=True, blank=True)
dob = models.DateField(null=True, blank=True)
gender = models.CharField(max_length=10, choices=GENDER_CHOICES, null=True, blank=True)
lati = models.CharField(max_length=100, null=True, blank=True)
long = models.CharField(max_length=100, null=True, blank=True)
fb_id = models.CharField(max_length=50, null=True, blank=True)
google_id = models.CharField(max_length=50, null=True, blank=True)
gapple_sub = models.CharField(max_length=50, null=True, blank=True)
notifications = models.BooleanField(default=True)
payment_token = models.CharField(max_length=200, null=True, blank=True)
source = models.CharField(max_length=10, choices=SOURCES, null=True, blank=True)
a_v = models.CharField(max_length=20, null=True, blank=True)

def __str__(self):
    # return "%s" % self.customer.get_full_name()
    return f'{self.id} - {self.customer.get_full_name()}'

and Order model:和订购型号:


    class Order(models.Model):
    STATUS_CHOICES = (
        (0, 'cancelled'),
        (1, 'new'),
        (2, 'accepted'),
        (3, 'waiting_for_driver'),
        (4, 'assigned_to_driver'),
        (5, 'waiting_to_pick_from_customer'),
        (6, 'picked_from_customer'),
        (7, 'reached_store_waiting'),
        (8, 'reached_store'),
        (9, 'processing'),
        (10, 'ready_to_pickup'),
        (11, 'waiting_for_driver_store'),
        (12, 'assigned_to_driver_store'),
        (13, 'picked_up_from_store_waiting'),
        (14, 'picked_up_from_store'),
        (15, 'delivered'),
        )
    

I would suggest to overwrite the save() method of your Order model to calculate and set those values at order creation.我建议覆盖 Order 模型的save()方法,以便在创建订单时计算和设置这些值。 Example:例子:

class Order(models.Model):
    ...
    def save(self, *args, **kwargs):
        if self._state.adding:  # order is created       
            self.order_count = my_count # something calculated
        super().save(*args, **kwargs)

For date fields you may also want to checkout the auto_now_add feature.对于日期字段,您可能还需要查看auto_now_add功能。 With that the order date will automatically set when created.这样,订单日期将在创建时自动设置。

See also:也可以看看:

In addition to what Erik has suggested you can also use signals ( specifically post_save in this case ) to achieve this.除了 Erik 建议的内容之外,您还可以使用信号(在这种情况下特别是 post_save )来实现这一点。 Using that you can avoid cluttering up your models and handle dependent actions separately and in a cleaner way.使用它可以避免混淆模型并以更简洁的方式单独处理相关操作。

@receiver(post_save, sender=Order)
def update_order_count(sender, instance, **kwargs):
   <logic_to_update_fields_in_customer_model>

On every Order save, this listener will be called and based on whatever logic you provide you can perform operations like update another model, creating audit entries and pretty much anything you want.在每次订单保存时,都会调用此侦听器,并根据您提供的任何逻辑执行操作,例如更新另一个模型、创建审计条目以及几乎任何您想要的操作。

Refer to Django signals: https://docs.djangoproject.com/en/4.0/topics/signals/参考 Django 信号: https ://docs.djangoproject.com/en/4.0/topics/signals/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM