2011-05-27 103 views
0

我对创建我的网址有疑问。我有这样一个模型 -django noob关于设计网址的问题

class Conversation(models.Model): 
    created_on = models.DateTimeField(auto_now_add=True) 
    subject = models.TextField() 
    started_by = models.ForeignKey(User,related_name='creator') 
    target = models.ForeignKey(User,related_name='receiver') 

class UnreadItems(models.Model): 
    unread = models.BooleanField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    user = models.ForeignKey(User,null=True) 
    content_object = generic.GenericForeignKey('content_type','object_id') 

我需要一个视图,其中我返回当前登录的用户(我身边有3类用户在我的应用程序)的所有未读会话。对于我的网址,我可能有foo.com/conversation/unread?user_id=234fsg88j,或者我可以简单地使用foo.com/conversation/unread/并使用request.user来过滤用户的对话。

后者是一种更稳健的方法和/或使用它的缺点是什么?

回答

3

不可否认,这是一个非常主观的问题,但我倾向于将有关特定用户的数据放在网址前面。由于对话是属于用户的资源,所以会跟随用户。 “未读”实际上是一种谓词,可以过滤掉某些数据,非常类似于页面范围或“加星标”项目,因此最终会以查询参数结束。最后,我喜欢我的参数很容易在JavaScript构建,所以我对这个网址看起来可能就像

/users/tokenmacguy/conversations?unread=true 

如果对话应该永远是除了拥有它们的用户可见的,那么它会去在一种资源,是每个用户,像

/my-profile/conversations?unread=true 
+0

我是一个'+ 1'为未读作为一个参数,因为以后你可以用其他的东西像'未读= FALSE'或'最新= 10'或'top = 50'等等。 – 2011-05-27 05:29:07

+0

这样他就必须测试tokenmacguy == request.user.username,这似乎有点多余恕我直言。作为参数的未读过滤器的确有意义。 – 2011-05-27 05:30:20

+0

@Paulo:第一种方式会将tokenmacguy的帖子显示给任何被允许查看它们的人。如果这在申请的背景下没有意义,那么第二个建议可能会更好。 – SingleNegationElimination 2011-05-27 05:39:26

2

后者是一种更健全的方法,因为它会使人们难以看到其他用户的未读对话。

2

从请求对象中获取用户,除非登录用户以外的任何人都能看到未读对话。