【发布时间】:2013-12-21 19:25:11
【问题描述】:
我正在编写一个小应用程序来向一群学生展示拍卖。我希望每个学生能够对几个(超过 1 个,少于 10 个)项目进行投标,然后向他们展示每个项目的投标分布。我想确保每个人只对每个项目进行一次出价。 (这些都是青少年,我敢肯定有人会试图通过对每个项目提交 10 个不同的投标来制造麻烦。)
我希望每个用户都能看到他们对任何他们出价的项目的当前出价值。我想让他们修改他们的出价(在一段时间内)。为此,我需要一些方法来为单个用户标记出价(因此他们只能查看/编辑自己的出价)。模型看起来像这样:
from django.db import models
class Lot(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
openforbids = models.BooleanField(default=False)
def __unicode__(self):
return u'%s' % self.name
class Bid(models.Model):
lot = models.ForeignKey('Lot')
amount = models.FloatField()
bidderid = **something goes here**
def __unicode__(self):
return u'Bid on lot %d' % self.lot
所以问题是,bidderid 字段在Bid 模型中应该采用什么形式?
- 我可以做一个完整的
User模型,并要求每个学生在讲座开始时注册。然后将bidderid和ForeignKey变成User。这似乎有点多。我宁愿不实现注册页面或强制他们使用密码。 - 我可以将
bidderid设为CharField并让每个学生输入一些内容。但这并没有提供每个人对各种项目的出价之间的任何联系。我会在(lot, bidderid)元组上设置unique_together约束,但这不会阻止学生通过多次组成新的bidderid字符串来简单地进行多次投标。 - 我可以将
bidderid设为CharField,但随后会自动填充来自request.session的信息。
我想走第三条路线并使用sessions 自动为使用该应用程序的每个人提供一个唯一的ID。我已经尝试在 Django 中阅读sessions,但对我将如何做到这一点还没有很好的理解。我只想为Bid 模型实现一个自定义save 方法,它将bidderid 设置为session 的一些独特之处。我该怎么做?我应该使用的唯一会话标识符的名称是什么?通常,您如何实现这样的事情,以便在您尝试从控制台创建模型实例时它们不会破坏块。 IE。如果我实现一个设置self.bidderid = something.from.request.session 的save 方法,那么当我尝试从没有request 对象的控制台保存bid 实例时会发生什么?
同样,如果我想让学生将他们的名字与出价相关联,那么在上述会话驱动框架中执行此操作的好方法是什么?理想情况下,当他们进入主页时,他们会看到一个询问“你叫什么名字”的表单字段。当他们提交它时,我会在 SessionName 模型中存储一行,该模型有两个字段:
class SessionName(models.Model):
sessionid = **the unique thing from request.session that we use to ID users**
chosenname = models.CharField() # the value they submit in the form
然后在整个应用程序中,我们可以将会话中的出价与他们在讲座开始时输入的chosenname 相关联。这有意义吗?
【问题讨论】:
标签: python django session django-sessions