【问题标题】:How do I reference my own record in a model in a Django view?如何在 Django 视图的模型中引用我自己的记录?
【发布时间】:2020-11-29 01:28:22
【问题描述】:

我有两个模型,Contestant 和 Team,它们之间有关系。它们的定义如下:

class Contestant(models.Model):
    contestant_email = models.EmailField(max_length = 254) 
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    assigned_team = models.ForeignKey('Team', on_delete=models.SET_NULL, blank=True, null=True)
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)  
    
class Team(models.Model):
    team_name = models.CharField(max_length=200)
    team_description = models.CharField(max_length=200)
    team_leader = models.ForeignKey(Contestant, on_delete=models.SET_NULL, blank=True, null=True)

我正在尝试建立一个链接“我的团队”,它将显示登录参赛者所在团队的所有参赛者。我无法对此进行硬编码,因此需要以某种方式让参赛者团队出现在视图中,以便我可以过滤我的查询集。

我的尝试如下:

class myteam(LoginRequiredMixin, SingleTableView):
    def get_queryset(self):
        qs = Contestant.objects.filter(assigned_team__id=self.request.user__assigned_team__id)
        return qs
    
    def get_template_names(self):
        return 'xgames/viewteam.html'

    def get_table_class(self):
        return TeamTable 

我意识到我对assigned_team__id=self.request.user__assigned_team__id 的尝试不正确,但我也意识到我看不到任何方法来检索调用视图的用户的团队 ID 并使用它来过滤我的查询集。

这一定是一个非常常见的用例,我确信有一个简单的解决方案,但我一直无法弄清楚,并且搜索会带来太多不相关的结果。

我有一个单独的视图来查看 anyteam,它需要一个 url 参数来显示任何团队,但我遇到了同样的问题。我找不到一种方法来获取我自己作为参赛者被分配到的团队的团队 ID,并将其作为模板中的链接传递。

这里的正确方法是什么?

【问题讨论】:

  • @ha-neul 不,我对 django 还是很陌生,边走边学。现在阅读它,谢谢。

标签: django django-views django-queryset


【解决方案1】:

我认为这个查询可以解决问题。

def get_queryset(self):
        qs = Contestant.objects.filter(assigned_team=self.request.user.contestant.assigned_team)
        return qs

【讨论】:

  • 工作出色,如此简单!所以我可以以类似的方式引用任何外键?现在我知道了,谢谢!
  • 不,这仅对OneToOne 字段有效。 ForeignKeys 的结构略有不同。从 Contestant 对象,您可以访问用户作为竞争者.user。但是,由于可以有多个参赛者连接到一个用户对象,因此您必须按照documentation 中的说明查询这些对象。
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2014-02-03
  • 2011-07-18
  • 2015-05-03
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多