2017-03-18 85 views
0

我想添加額外的字段到多對多的關係,我創建了一個名爲Contact的中間模型(目標是實現一個系統,允許用戶關注其他用戶並遵循)。Django 1.10路徑掛載'C:',在掛載'D'開始:'

class Contact(models.Model): 

    user_from = models.ForeignKey(User, 
            related_name='rel_from_set') 

    user_to = models.ForeignKey(User, 
           related_name='rel_to_set') 

    created = models.DateTimeField(auto_now_add=True, 
            db_index=True) 
    class Meta: 
     ordering = ('-created',) 

    def __str__(self): 
     return '{} follows {}'.format(self.user_from, self.user_to) 

我使用Django提供的用戶模型(來自django.contrib.auth.models)。由於這個模型不是我創建的,如果我想添加字段,我應該(或者至少,我認爲我應該)在dinamically(與猴子補丁)添加它們。因此,在models.py文件的末尾添加以下代碼:

User.add_to_class('following', models.ManyToManyField('self', through=Contact , related_name='followers', symmetrical=False)) 

但我拼命地跑了python manage.py makemigrations我得到了以下錯誤:

Migrations for 'auth': 
Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\__init__.py", line 367, in execute_from_command_line 
    utility.execute() 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\__init__.py", line 359, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\base.py", line 294, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\base.py", line 345, in execute 
    output = self.handle(*args, **options) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\commands\makemigrations.py", line 192, in handle 
    self.write_migration_files(changes) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\managem 
ent\commands\makemigrations.py", line 210, in write_migration_files 
    migration_string = os.path.relpath(writer.path) 
    File "C:\Program Files (x86)\Python35-32\lib\ntpath.py", line 574, in relpath 
    path_drive, start_drive)) 
ValueError: path is on mount 'C:', start on mount 'D:' 

一個快速谷歌搜索後:

「os.relpath的確給你兩個目錄之間的相對路徑

你遇到的問題是,在Windows上,如果兩個目錄位於不同的驅動器上(這正是錯誤消息所說的)。 「

但如何解決? 我使用Windows 8和Django的1.10。

+0

是什麼讓你認爲錯誤與添加的字段有關?無論如何,你應該展示完整的回溯。 –

+0

@DanielRoseman完整追蹤發佈。錯誤發生後,我添加了上面的代碼,所以我很積極,這是問題所在。 – ROBlackSnail

回答

1

您從另一個驅動器運行makemigrations(而不是從C: Django在何處安裝)。

有一個bug在Windows makemigrations:

因此,要解決這個錯誤,你應該:

  • C:驅動器上移動Django項目(Python代碼)
  • 或更新你的Django版本(以Django的1.11)
+0

如果我自己修改了Django代碼,就像在你提供的第二個鏈接中一樣([link](https://github.com/django/django/commit/f94ce0d21de484a5783a3dcb122dc51757ed225b))它會工作嗎?我擔心如果我更新到Django 1.11,我的項目將無法正常工作。 – ROBlackSnail

+1

是的,它應該工作,但它是一個hacky修復程序。每次更新或安裝django時(例如,在另一臺計算機上安裝項目時),您都必須再次手動修補此'makemigrations.py'文件。不過我想你只需要在開發期間運行makemigrations,所以使用這個黑客可以很好。 – pchiquet

+0

感謝您的幫助! – ROBlackSnail