【问题标题】:django foreign key conditionaldjango外键条件
【发布时间】:2018-10-16 15:03:11
【问题描述】:

下面是我的模型。

class DoneType (AbstractTimeStamp):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, primary_key=True)

class Done (AbstractTimeStamp):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    contents = models.CharField(max_length=200)
    done_type = models.ForeignKey(DoneType, on_delete=models.SET_NULL, null=True)
    start_time = models.DateTimeField()

> 一个用户可以拥有多个 DONE 模型。并且 DONE 模型可以有许多 DONE_TYPE 模型。
但是,这只有在 DONE 模型中的 USER 与 DONE_TYPE 模型中的 USER 相同时才有可能。
我该如何实现?

【问题讨论】:

  • 您不需要 DoneType 模型中的 user 字段。
  • @art06 是对的。您通过拥有一个冗余字段来非规范化您的关系模式。出于性能原因,这有时可能是可取的,但我非常怀疑这是否适合您。如果您需要访问DoneType 实例中的user 字段,您始终可以使用done_type.done.user

标签: django model


【解决方案1】:

DoneType.userDone 继承它的ForeignKey 会更有意义,然后你可以通过done_type.user.user 调用它。

这样,您甚至不需要进行任何比较,因此不需要额外的数据库命中(也更快)

但是如果你想比较这两个字段,你会在你的视图中做这样的事情......

假设done = Done.objects.get(id=1)done_type = DoneType.objects.get(id=1)

if done.user == done_type.user:
    # do something

但是这样比较是个坏主意。

【讨论】:

  • 在视图代码中执行此检查是一个非常糟糕的建议。您可能在代码中创建Done/DoneType 实例的几个点,并且您的建议要求不要忘记在任何这些地方添加该比较。建议覆盖其中一个模型的 save() 方法以将其作为约束来实现会更好。
  • 是的,就像我建议的那样,这是个坏主意。但问题是如何比较它们,所以考虑到这一点,我回答正确。 然后,我向他展示了一个更好的方法,因为使用该方法您甚至根本不需要进行检查 (通过将 ForeignKey 相关的 DoneType 设置为 Done,而不是再次使用 User). 这样就不需要重写.save() 方法,所以不需要比较……至少到目前为止他给我们的信息是这样。因为有些人在阅读整篇文章时有问题,我想我先把那一点放在第一位。
猜你喜欢
  • 1970-01-01
  • 2020-06-08
  • 2019-09-30
  • 2022-06-11
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2017-05-18
相关资源
最近更新 更多