V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
bslnet
V2EX  ›  Django

关于 django models 的 limit_choices_to

  •  
  •   bslnet · Nov 15, 2016 · 5919 views
    This topic created in 3456 days ago, the information mentioned may be changed or developed.

    初学 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 ,这种情况下比较好的处理方式是什么。

    glasslion
        1
    glasslion  
       Nov 15, 2016   ❤️ 1
    在这个例子里,`limit_choices_to` 没有多大用处。

    可以重载 `Model.save()` 加上对 `win_bid_user` 取值合法性的验证。
    这里有个先有鸡还是先有蛋问题:
    1. 只有先 save Task 后,才能添加 bid_user 关系映射
    2. Task.save() 时, 要检查, `win_bid_user` 属于 `bid_user`
    要稍作处理
    bslnet
        2
    bslnet  
    OP
       Nov 15, 2016
    @glasslion 感谢答复,能不能详细说一下?看了文档和源码,还没想出来怎么下手。
    自己想了个办法。
    ···
    class WinBidUser(models.Model):
    task = models.OneToOneField(Task)
    win__bid_user = models.Foreign(User, limit_choices_to)
    ```
    现在在查文档看看 limit_choices_to 怎么写,能不能写出来。不过就算这种方法管用,为了这一点需求就增加 OneToOneField 有点影响性能。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2364 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:31 · PVG 18:31 · LAX 03:31 · JFK 06:31
    ♥ Do have faith in what you're doing.