noa*_*ale 2 python django postgresql datetime django-models
我想知道是否有办法将datetime auto_now_add = True列添加到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)
Run Code Online (Sandbox Code Playgroud)
在我的postgresql数据库中,我有一个单独的表格,名为"djangoapp_ photographer _likes".
在此表中,我有三列:
id photographer_id photo_id
[PK] serial integer integer
1 3 6
2 3 7
3 3 8
Run Code Online (Sandbox Code Playgroud)
经过几个月的投入生产,我意识到我会要求我们喜欢这些照片的日期时间.所以不是三列,而是四列:
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
Run Code Online (Sandbox Code Playgroud)
是否可以添加这个额外的列,即使它不在模型中?我想要它,以便每次拍照时,都会记录喜欢的时间.如果这是不可能的,我应该研究一下其他的解决方法吗?
编辑
这是我的照片模型:
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)
Run Code Online (Sandbox Code Playgroud)
是的,这很正常.您将为Likes关系声明一个显式模型,并在其上添加datetime字段.查看多对多字段文档以获取完整详细信息和一些示例 - 组成员身份示例包括"加入日期"字段,其与您的时间戳相同.使用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)
Run Code Online (Sandbox Code Playgroud)
正如文档所述,使用此设置创建喜欢的方法有点受限:
与普通的多对多字段不同,您不能使用添加,创建或分配(即,beatles.members = [...])来创建关系
为什么?您不能只在Person和Group之间创建关系 - 您需要指定Membership模型所需关系的所有细节.简单的添加,创建和赋值调用不提供指定此额外细节的方法.因此,对于使用中间模型的多对多关系,它们被禁用.创建此类关系的唯一方法是创建中间模型的实例.
在这种情况下,理论上可以确定附加细节,因为它是一个自动时间戳,但是Django不能完全检测到它.
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |