Как в django изменить файл на имя модели: 'order count' при создании другого объекта модели?

У меня есть две модели Customer и Order и я хочу сделать 3 поля, которые обновляются при создании объекта Order. полями являются Order_Count:--, First_Order:order_date, Last_Order: order_date

как мне это сделать?

Модель клиента:

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

и модель заказа:

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

Я бы предложил переписать метод save() в вашей модели заказа, чтобы вычислять и устанавливать эти значения при создании заказа. Пример:

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)

Для полей даты вы также можете воспользоваться функцией auto_now_add. При этом дата заказа будет автоматически устанавливаться при создании.

См. также:

В дополнение к тому, что предложил Эрик, вы также можете использовать сигналы (в данном случае post_save) для достижения этой цели. Используя это, вы сможете избежать загромождения моделей и обрабатывать зависимые действия отдельно и более чистым способом.

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

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

Обратитесь к сигналам Django: https://docs.djangoproject.com/en/4.0/topics/signals/

Вернуться на верх