2015-01-02 12 views
11

Tôi có một mô hình trong ứng dụng đang chạy trong một máy chủ có một số mục nhập. Tôi cần phải thêm một SlugField, duy nhất và không null cho mô hình này. SlugField sẽ được điền dựa trên trading_name. Tôi đã thay đổi mô hình của tôi để thêm lĩnh vực mới này và điều chỉnh tiết kiệm phương pháp:Thêm trường không rỗng và duy nhất với mô hình đã được điền sẵn

class Supplier(StatusModel): 
    SLUG_MAX_LENGTH = 210 
    slug = models.SlugField(unique=True, max_length=SLUG_MAX_LENGTH) 
    trading_name = models.CharField(max_length=200, verbose_name=_('trading name')) 
    ... 

    def save(self, *args, **kwargs): 
     self.slug = orig = slugify(self.trading_name)[:Supplier.SLUG_MAX_LENGTH] 

     for x in itertools.count(1): 
      if not Supplier.objects.filter(slug=self.slug).exists(): 
       break 
      # Truncate the original slug dynamically. Minus 1 for the hyphen. 
      self.slug = "%s-%d" % (orig[:Supplier.SLUG_MAX_LENGTH - len(str(x)) - 1], x) 

     self.full_clean() 
     super(Supplier, self).save(*args, **kwargs) 

Sau khi thay đổi mô hình, tôi đã chạy manage.py makemigrations và đã di cư này là đầu ra:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('opti', '0003_auto_20141226_1755'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='supplier', 
      name='slug', 
      field=models.SlugField(unique=True, default='', max_length=210), 
      preserve_default=False, 
     ), 
    ] 

tôi không thể chạy manage.py migrate vì giá trị mặc định sẽ không hoạt động do dấu duy nhất.

Câu hỏi của tôi là: Làm cách nào tôi có thể thực hiện việc này với Django 1.7? Tôi cần phải áp dụng thay đổi lược đồ và giữ các mục nhập hiện tại trong cơ sở dữ liệu của tôi.

+1

Đăng di chuyển đã tạo của bạn để chúng tôi có thể thay đổi nó – FrEaKmAn

+0

Cảm ơn @FrEaKmAn - Tôi đã thêm chi tiết phù hợp :) – MatheusJardimB

Trả lời

14

Unfortunatelly, tôi không tìm thấy câu trả lời nhưng tôi có thể tạo ra một giải pháp:

  • Trước tiên, tôi đã tạo di chuyển cho phép trường slug có thể rỗng;
  • Sau đó, tôi đã tạo một di chuyển khác điền vào cột sên với các giá trị thích hợp cho mọi hàng trong mô hình;
  • Sau đó, một lần di chuyển khác bổ sung ràng buộc không null trong cột.
+3

Dường như đây là đề xuất của Django - https://docs.djangoproject.com/en/ 1.9/howto/write-migrations/# migrations-that-add-unique-fields – wasabigeek

2

Bạn làm thay đổi mô hình của bạn (thêm lĩnh vực, thay đổi, vv), sau đó bạn gọi manage.py makemigrations, sau đó áp dụng công nhập cư với manage.py migrate

Bạn có thể thêm lĩnh vực này với null=True, sau đó bạn ví dụ làm cho một kịch bản để cư một lần

Ngược lại, nếu bạn cần phải cư lĩnh vực trong phạm vi di cư bạn có thể viết một tùy chỉnh một, xem https://docs.djangoproject.com/en/1.7/ref/migration-operations/#writing-your-own

Các vấn đề liên quan