2016-05-15 17 views
1

比方說,我有一個枚舉表看起來像這樣(我知道,它沒有任何意義,但它現在是不相關的:)):枚舉TABEL的Django的更新行

class Pet: 
    ANIMALS = (
     ('D', 'Dog'), 
     ('C', 'Cat'), 
    ) 
    pet = models.CharField(primary_key=True, choices=ANIMALS) 

    ... 

而且假設我在另一個使用Pet類的表中創建了一些行。如果在某些時候,我決定需要將('D','Dog')更改爲('S','Snake'),那麼Django會自動檢測包含「Dog」並更新它們的行嗎?

回答

0

首先,您的模型有幾個問題。它不會從models.Model繼承。而「選擇」領域並不是一個好的主要關鍵人選。如果是這樣,你的表中只能有兩條記錄。所以你的模型應該是

class Pet(models.Model): 
    ANIMALS = (
     ('D', 'Dog'), 
     ('C', 'Cat'), 
    ) 
    pet = models.CharField(max_length=2, choices=ANIMALS) 

而你在這裏使用int真的更好。

( 'd', '狗')到( 'S', '蛇')將Django的自動檢測包含 '狗' 行 並更新它們?

它會創建一個遷移,但遷移不會更改數據。如果你想改變舊的數據只需鍵入./manage.py shell打開控制檯,然後做

from myapp.models import Pet 
Pet.objects.filter(pet='D').update(pet='S') 

注意,通過Pet.objects.all循環()和更新逐一效率不高。

0

不幸的是,Django不會自動執行此操作。您需要定義數據庫遷移以將寵物列中的數據從「D」更改爲「S」。

這裏是一個直接鏈接到文檔的相應部分: https://docs.djangoproject.com/en/1.9/topics/migrations/#data-migrations

你的使用情況類似於Django提供的例子。在您的遷移文件中,您應該可以遍歷所有Pet對象,並將每個實例的pet屬性從「D」更改爲「S」。

下面未經測試,但可能是進行此更改的起點。

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.db import migrations, models 

def change_pet_key(apps, schema_editor): 
    # We can't import the Pet model directly as it may be a newer 
    # version than this migration expects. We use the historical version. 
    Pet = apps.get_model("yourappname", "Pet") 
    for pet in Pet.objects.all(): 
     pet.pet = 'S' 
     pet.save() 

class Migration(migrations.Migration): 
    initial = True 

    dependencies = [ 
     ('yourappname', '0001_initial'), 
    ] 

    operations = [ 
     migrations.RunPython(change_pet_key), 
    ]