Как обновить поле моделей на основе другого поля тех же моделей - PullRequest
0 голосов
/ 19 февраля 2019
class PurchaseOrder(models.Model):
   purchase_order_id = models.AutoField(primary_key=True)  
   purchase_order_number = models.CharField(unique=True)
   vendor = models.ForeignKey(Vendor)

Я создаю таблицу заказов на покупку (po).при создании po я должен обновить purchase_order_number как «PO0» + purchase_order_id ex PO0123 (123 - первичный ключ).поэтому я использую def save в моделях, чтобы выполнить это

def save(self):
    if self.purchase_order_id is not None:
        self.purchase_order_number = "PO"+str(self.purchase_order_id)
    return super(PurchaseOrder, self).save()

Он отлично работает с одним созданием, но когда я пытаюсь создать большую часть данных с помощью саранчи (инструмент тестирования), выдает ошибку duplicate entry for PurchseOrdernumber Можетмы изменяем значение поля в самой модели примерно так:

purchase_order_number = models.CharField(unique=True,default=("PO"+self.purchase_order_id )

1 Ответ

0 голосов
/ 19 февраля 2019

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

if self.purchase_order_id is not None:
    self.purchase_order_number = "PO"+str(self.purchase_order_id)

Здесь purchase_order_id будет None при создании нового экземпляра.Кроме того, пока вы не вызовете super(PurchaseOrder, self).save(), он не будет генерировать purchase_order_id, что означает, что purchase_order_number будет пустым.

Итак, я бы порекомендовал не хранить эту информацию в БД.Он в основном такой же, как purchase_order_id с PO перед ним.Вместо этого вы можете использовать метод свойства, чтобы получить то же значение.Например:

class PurchaseOrder(models.Model):
   purchase_order_id = models.AutoField(primary_key=True)
   # need to remove `purchase_order_number = models.CharField(unique=True)`
   ...

   @property 
   def purchase_order_number(self):
       return "PO{}".format(self.purchase_order_id)

Итак, вы также можете увидеть purchase_order_number примерно так:

p = PurchaseOrder.objects.first()
p.purchase_order_number

Недостатком этого решения является то, что вы не можете сделать запрос в поле свойства.Но я не думаю, что это было бы необходимо в любом случае, потому что вы можете сделать тот же запрос для purchase_order_id, то есть PurchaseOrder.objects.filter(purchase_order_id=1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...