我有一個生產中的表,它集成在系統的任何地方,現在我需要在表中添加一個具有默認值的新列,但不想更改所有現有邏輯,最好的方法是什么?
class People(models.Model):
name = models.CharField(max_length=20)
gender = models.CharField(max_length=20)
class = models.CharField(max_length=20)
在系統中,我們到處都有這種查詢
People.objects.filter(gender='male')
People.objects.filter(gender='female', class="3rd")
...
現在我們需要添加一個新欄位:
class People(models.Model):
name = models.CharField(max_length=20)
gender = models.CharField(max_length=20)
class = models.CharField(max_length=20)
graduated = models.BooleanField(default=False)
假設所有現有的資料都應該graduated是 False,所以如果我們可以添加graduated=False每個查詢,那么所有現有的邏輯都應該可以作業,但是有什么辦法可以做到這樣我們就不需要更改任何現有代碼,但它們會假設graduated=False?
uj5u.com熱心網友回復:
是的,你可以做一個管理者,從而.objects將只保留People有graduated=False:
class PeopleManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(graduated=False)
class People(models.Model):
name = models.CharField(max_length=20)
gender = models.CharField(max_length=20)
class = models.CharField(max_length=20)
graduated = models.BooleanField(default=False)
objects = PeopleManager()
all = models.Manager()
您可以使用People.all.all()檢索所有People,并People.objects.all()檢索所有People未畢業的。
話雖如此,我不建議這樣做:通常People.objects.all()給人的印象是會檢索所有 People. 正如Python之禪所說:“顯式優于隱式”:最好是代碼解釋和提示它在做什么,而不是將過濾移動到隱藏在管理器中的某個地方。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/383196.html
標籤:Python mysql 姜戈 数据库 django 模型
上一篇:如何獲取最新值?
下一篇:MySQL-僅在非空時連接
