2013-07-22 26 views
1

我想知道是否有一種方法將datetime auto_now_add = True列添加到manytomany字段。 我有以下模型。是否可以將一個日期時間列添加到manytomany字段?

class Photographer(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    bio = models.CharField(max_length=140, blank=True) 
    favorites = models.ManyToManyField('Photo', through='Favorites', related_name = 'photographer_favs') 
    likes = models.ManyToManyField('Photo', related_name='likedby', blank=True) 

在我的PostgreSQL數據庫,我有喜歡被稱爲 「djangoapp_ 攝影師 _likes」 一個單獨的表。

在這個表,我有三列:

id     photographer_id  photo_id 
[PK] serial  integer    integer 
    1     3     6 
    2     3     7 
    3     3     8 

幾個月投產後,我意識到,我需要時,這些照片我們喜歡的日期時間。所以,而不是三列我會有四個:

id    photographer_id  photo_id  liked 
[PK] serial  integer    integer  timestamp with time zone 
    1     3     6   2013-07-10 23:30:19.559463+00 
    2     3     7   2013-07-11 17:00:53.39614+00 
    3     3     8   2013-07-11 17:25:28.4953+00 

是否有可能添加此額外的列,即使它不在模型中?我需要它,以便每次拍攝照片時都會記錄它喜歡的時間。如果這是不可能的,我應該考慮哪些其他解決方法?

編輯

這是我的照片模式:

class Photo(models.Model): 
    title = models.CharField(max_length=40, blank=True) 
    photographer = models.ForeignKey(Photographer, related_name = 'shot_owner') 
    postTime = models.DateTimeField(auto_now_add=True) 
    description = models.CharField(max_length=255, blank=True) 
    url = models.CharField(max_length=128) 
+0

關係表(解析兩個實體表之間的多對多關係)具有屬性是很常見的。我們只是想確定屬性是關係的一個屬性,而不是其中一個實體,或者它本身不是一個實體。 – spencer7593

回答

4

是的,這是正常的。您將爲「喜歡」關係聲明一個明確的模型,並在其上添加datetime字段。查看many-to-many field docs以獲取完整的詳細信息和一些示例 - 組成員資格示例包括「加入日期」字段,與您的時間戳相同。在字段定義中使用auto_now_add=True應該自動記錄時間戳。

class Photographer(models.Model): 
    # as above, but: 
    likes = models.ManyToManyField('Photo', through='PhotoLikes', related_name='likedby', blank=True) 

class PhotoLikes(models.Model): 
    class Meta: 
     db_table = 'djangoapp_photographer_likes' 
     # or whatever your table is called 
    photo = models.ForeignKey(Photo) 
    photographer = models.ForeignKey(Photographer) 
    liked = models.DateTimeField(null=True, blank=True, auto_now_add=True) 

由於文檔說明,方法來創建喜歡的是多一點限制與此設置:

不同於一般的多到許多領域,您不能使用添加,創建或轉讓(即,beatles.members = [...])來創建關係

爲什麼?您不能僅在Person和Group之間創建關係 - 您需要指定Membership模型所需關係的所有詳細信息。簡單的添加,創建和賦值調用不提供指定這些額外細節的方法。因此,它們在使用中間模型的多對多關係中被禁用。創建這種類型的關係的唯一方法是創建中間模型的實例。

在這種情況下,理論上是可能的,以確定額外的細節,因爲它是一個自動的時間戳,但Django是不太能夠檢測到。

+0

感謝您的快速回復,即使喜歡已經是ManyToMany外鍵照片,我會遇到問題嗎? – noahandthewhale

+0

也!我相信它是auto_now_add :) – noahandthewhale

+0

您需要確保模型使用您現有的表格,可能是通過重命名現有表格或使用Meta類別中的'db_table'設置來實現您的中介模型。或者通過適當選擇您的中介模型的名稱。當然,你必須自己添加數據庫列--syncdb不會這樣做,因爲它要在現有的表上。 –

相關問題