2012-04-10 81 views
1

我繼承了一個大的Django應用程序,它都具備這個成語的型號爲「顯示」應用程序:是否有可能將django模型類與ManyToMany關係合併?

class Movie_Playlist(models.Model): 
    name = models.CharField(max_length=150) 
    # More fields here... 

    players = models.ManyToManyField(
     User, related_name='playlists_played', null=True, blank=True) 

class PlaylistPlayer(models.Model): 
    user   = models.ForeignKey(User, related_name='play_links') 
    movie_playlist = models.ForeignKey(Movie_Playlist, related_name='playlist_plays') 
    count   = models.IntegerField(default=0) 
    last_played = models.DateTimeField(editable=False) 

    class Meta: 
     db_table = 'shows_movie_playlist_players' 

儘可能靠近我可以告訴大家,這個想法可能是shows_movie_playlist_players表(這將是由ManyToManyField關係創建)應該通過除了關係本身之外存儲每個用戶的信息來完成雙重任務。當然,原始數據庫中似乎只有兩個相關的表:「shows_movie_playlist」和「shows_movie_playlist_players」。

此外,它的價值在於,Django 1.2.3 - 1.3.1中的「驗證」正確。

這都將是罰款和花花公子,但它打破了由當它試圖自shows_movie_playlist_players已經由創建創建測試數據庫中的「蟒蛇manage.py測試」方法「ManyToManyField ......」規範它到達PlaylistPlayer類的時間。

如果我註釋掉「ManyToManyField ...」行,我可以創建測試數據庫並運行測試,而不會出現任何問題。否則,我得到這個:

> python manage test shows -v3 
Creating test database for alias 'default' ('test_production')... 
Creating tables ... 
Creating table shows_movie_playlist_players 
Creating table shows_movie_playlist 
Creating table shows_movie_playlist_players 
Traceback (most recent call last): 
    File "manage.py", line 16, in <module> 
    execute_manager(settings) 
    ... Lots of tracebackage here... 
_mysql_exceptions.OperationalError: (1050, "Table 'shows_movie_playlist_players' already exists") 

所以這是一個正確指定關係,覆蓋表,只是沒有對測試的支持又或者是可怕的錯誤?

感謝您的閱讀!

回答

1

哦哇......我覺得你:)是的,這是可怕的錯誤,但它可能有一個簡單的解決方案。 基本上它是一個試圖完成一個ManyToManyField

「通過」功能的黑客試着指定through='shows.PlaylistPlayer' on the玩家的m2m字段,看看它的行爲如何。

+0

好的!我這樣做了,我可以運行測試...你認爲我應該用db_table規範擺脫PlaylistPlayer的Meta類嗎? 謝謝! – oofoe 2012-04-10 21:32:27

+0

我想你可能應該這樣做,但要注意這會將'PlaylistPlayer'的結果數據庫表名稱更改爲'shows_playlistplayer'。所以如果你有一個現有的數據庫(比如在製作中),你需要一個模式遷移來重新命名table_movie_playlist_players中的表。儘管如此,如果你不想處理這個問題,這並不是一個大問題。 – 2012-04-10 21:54:18

+0

我認爲此刻,我想盡可能地做出少許改變,同時仍然允許我在測試中得到它。非常感謝您的閃電回答! – oofoe 2012-04-10 22:12:57