【问题标题】:Use multiple foreign keys使用多个外键
【发布时间】:2017-08-21 15:58:23
【问题描述】:

我是 Django 的初学者,在 Python 上有点高级。我对 Django 感到非常惊讶,而且我已经玩了大约一个星期了。我查看了很多教程和 stackoverflow 问题/答案,发现了很多。

但是,当谈到 OneToMany / Foreign Key 关系以及访问它的方式时,我仍然有点迷茫。我查看了官方文档的“Library/Book”示例,但仍在试图弄清楚如何解决以下问题。

[解释]

  • 我有用户(已经创建)
  • 对于 Django 构建的用户,我添加了一个配置文件 (OneToOneField)
  • 配置文件仅包含每个用户的一项:标题(外键)
  • 标题又来自现有的可用标题列表
  • 最后,我有一个机会(一类),它有一个用户链接(外键)

在models.py中

class ProfileStatus(models.Model):
    """ table of available titles for users  """
    status = models.CharField(max_length=100)
    def __str__(self):
        return self.status

class Profile(models.Model):
    """ add a title to an existing user """
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    title = models.ForeignKey(ProfileStatus, on_delete=models.CASCADE)

class OpportunityStatus(models.Model):
    """ status for an opportunity """
    status = models.CharField(max_length=100)
    def __str__(self):
        return self.status

class Opportunity(models.Model):
    """ An opportunity """
    name = models.CharField(max_length=100, default='')
    director = models.ForeignKey(User, on_delete=models.CASCADE)
    status = models.ForeignKey(OpportunityStatus, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

[我在寻找什么]

我想知道你会怎么做:

  • 对于标题为“导演”的用户
  • 获取作为主管链接的机会列表
  • 然后将此列表过滤到状态为“活动”的机会,然后传递给视图(我可以管理)

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    通常您使用双下划线语法来跟随关系。因此,例如,要获取具有主管头衔的用户,您可以:

    User.objects.filter(profile__title__status='Director')
    

    但是,如果您想要机会而不是用户,则需要从机会模型开始。所以:

    Opportunity.objects.filter(status__status='alive', director__profile__title__status='Director')
    

    如果您将 Opportunity 指向 Profile 而不是 User,则此查询可能会稍微不那么可怕。

    【讨论】:

    • 太棒了,第二个选项正是我一直在拼命寻找的(__director__profile__title_status...)!但是 status='alive' 需要是 status=ID 而不是关键字,您知道我如何拥有 status='alive' 而不是 status=ID 吗?非常感谢您的帮助!不幸的是,我不能投票,因为我是 Stack 的新手,但一旦我得到足够的分数,我就会回来投票:)
    • 我更新了,应该是status__status。您可能想多考虑一下名称,将外键命名为与目标模型中的实际字段相同的名称会令人困惑。也许 OpportunityStatus 和 ProfileStatus 应该有 name 字段而不是 status
    • 是的,你的名字是完全正确的——这令人困惑。一切都整理好了,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2010-10-15
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多