Как в 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. При этом дата заказа будет автоматически устанавливаться при создании.
См. также:
- Переопределение методов: https://docs.djangoproject.com/en/4.0/topics/db/models/#overriding-model-methods .
- Функция автоматического добавления (auto_now_add): https://docs.djangoproject.com/en/4.0/ref/models/fields/#django.db.models.DateField.auto_now
В дополнение к тому, что предложил Эрик, вы также можете использовать сигналы (в данном случае 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/