Django: изменение значения определенных полей в предыдущих экземплярах модели, если возникает конкретный экземпляр

#python #django #django-models

#python #django #django-модели

Вопрос:

Я создаю небольшой проект django. Есть ли способ изменить значение определенных полей в предыдущих экземплярах конкретной модели?

 class Fruit (models.Model):
    name=models.CharField(max_length=40)
        amount=models.IntegerField()
 

Пока, например, у меня есть три экземпляра моей модели.

 [0 Object{ "model": "Fruit","pk": 1,"fields": {"name": "Banana", "amount": "2"}},
1 Object{ "model": "Fruit","pk": 2,"fields": {"name": "Apple", "amount": "2"}},
2 Object{ "model": "Fruit","pk": 3,"fields": {"name": "Mango", "amount": "1"}}]
 

И я решил, что четвертый экземпляр будет оранжевым в количестве 3.

 [0 Object{ "model": "Fruit","pk": 1,"fields": {"name": "Banana", "amount": "2"}},
1 Object{ "model": "Fruit","pk": 2,"fields": {"name": "Orange", "amount": "2"}},
2 Object{ "model": "Fruit","pk": 3,"fields": {"name": "Orange", "amount": "1"}}
3 Object{ "model": "Fruit","pk": 4,"fields": {"name": "Orange", "amount": "3"}}]
 

Как вы видите, моя цель — изменить все предыдущие названия фруктов на Orange в случае создания экземпляра с Orange в качестве имени
до появления Banana, чтобы banana оставался неизменным.

Есть ли какой-нибудь способ сделать что-то подобное?

Комментарии:

1. Что, если перед бананом есть яблоко? Что происходит с этим яблоком?

2. Хороший вопрос. В моем проекте, если бы Apple была до banana, она осталась бы прежней.

Ответ №1:

вы можете перебирать свой Fruit объект и изменять все имена в зависимости от условия

 for item in Fruit.objects.all():
   if item.name == "Banana":
      pass
   else:
      Fruit.objects.update(..update values)
 

Ответ №2:

После создания нового экземпляра вы можете перебирать все экземпляры в обратном порядке, пока не будет найдено ключевое слово (например, «Banana»). Смотрите Документацию для обратного метода. Прервите цикл, если ключевое слово найдено, иначе измените название фрукта (например, на «Оранжевый»).

 for fruit in Fruit.objects.all().reverse():
    if fruit.name == "Banana":
        break
    else:
        fruit.name = "Orange"
        fruit.save()
 

Это решение предполагает, что вы хотите внести изменения сразу после создания экземпляра (поэтому в вашем примере четвертые экземпляры будут последним экземпляром).