关于 django models 的 limit_choices_to

2016-11-15 14:37:17 +08:00
 bslnet

初学 django ,正在做一个项目。其中有一个模块是网站内有各种任务,用户可以投标,最终有一个用户中标。

class Task(models.Model):
    bid_user = models.ManyToManyField(User, verbose_name='投标用户')
    win_bid_user = models.ForeignKey(User, verbose_name='中标用户')

其中 wind_bid_user 应该从 bid_user 的列表中选取一个出来。开始想用 limit_choices_to ,可是怎么表示呢。网上查了一下, stackoverflow 上有人说这样做不行,应该用其它的方法。想问一下诸位,是不是 limit_choices_to 处理不了这样的问题。如果不能用 limit_choices_to ,这种情况下比较好的处理方式是什么。

5408 次点击
所在节点    Django
2 条回复
glasslion
2016-11-15 16:23:17 +08:00
在这个例子里,`limit_choices_to` 没有多大用处。

可以重载 `Model.save()` 加上对 `win_bid_user` 取值合法性的验证。
这里有个先有鸡还是先有蛋问题:
1. 只有先 save Task 后,才能添加 bid_user 关系映射
2. Task.save() 时, 要检查, `win_bid_user` 属于 `bid_user`
要稍作处理
bslnet
2016-11-15 17:57:51 +08:00
@glasslion 感谢答复,能不能详细说一下?看了文档和源码,还没想出来怎么下手。
自己想了个办法。
···
class WinBidUser(models.Model):
task = models.OneToOneField(Task)
win__bid_user = models.Foreign(User, limit_choices_to)
```
现在在查文档看看 limit_choices_to 怎么写,能不能写出来。不过就算这种方法管用,为了这一点需求就增加 OneToOneField 有点影响性能。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/320666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX