【问题标题】:Django - Filter objects from another modelDjango - 从另一个模型中过滤对象
【发布时间】:2014-09-30 12:26:30
【问题描述】:

抱歉,如果标题名称不好,但我不知道如何解释。我想为进入 Captains 模型制作一个表格,但是需要有一个 queryset 过滤器,以便您只能从用户的 FantasyTeam。

我的模型如下:

class Player(models.Model):
    player_id = models.IntegerField(primary_key=True)
    team = models.ForeignKey(Team)
    player_name = models.CharField(max_length=140)
    position = models.CharField(max_length=10)
    first_name = models.CharField(max_length=70)
    last_name = models.CharField(max_length=70)
    known_name = models.CharField(max_length=70,blank=True)
    birth_date = models.DateField('birth date')
    weight = models.IntegerField()
    height = models.IntegerField()
    jersey_num = models.IntegerField()
    real_position = models.CharField(max_length=25)
    join_date = models.DateField('join date')
    country = models.CharField(max_length=30)
    value = models.DecimalField(max_digits=3,decimal_places=1)
    is_active = models.BooleanField(default=False)
    def __str__(self):
        return '%s (%s)' % (self.player_name,self.value)

class FantasyTeam(models.Model):
    FANTASY_TEAM_ID = models.AutoField(primary_key=True)
    team_name = models.CharField(max_length=25)
    player1 = models.ForeignKey(Player, related_name='csplayer1')
    player2 = models.ForeignKey(Player, related_name='csplayer2')
    player3 = models.ForeignKey(Player, related_name='csplayer3')
    player4 = models.ForeignKey(Player, related_name='csplayer4')
    player5 = models.ForeignKey(Player, related_name='csplayer5')
    player6 = models.ForeignKey(Player, related_name='csplayer6')
    player7 = models.ForeignKey(Player, related_name='csplayer7')
    player8 = models.ForeignKey(Player, related_name='csplayer8')
    player9 = models.ForeignKey(Player, related_name='csplayer9')
    player10 = models.ForeignKey(Player, related_name='csplayer10')
    player11 = models.ForeignKey(Player, related_name='csplayer11')
    player_sub_gk = models.ForeignKey(Player, related_name='cssubgk')
    player_sub_1 = models.ForeignKey(Player, related_name='cssub1')
    player_sub_2 = models.ForeignKey(Player, related_name='cssub2')
    player_sub_3 = models.ForeignKey(Player, related_name='cssub3')
    def __str__(self):
        return '%s' % (self.team_name)

class Captains(models.Model):
    fantasy_team = models.OneToOneField(ClassicSeasonFantasyTeam,primary_key=True)
    captain = models.ForeignKey(Player, related_name='cscaptain')
    vice_captain = models.ForeignKey(Player, related_name='csvicecaptain')

#Associates a user with a FantasyTeam
class ClassicSeasonUserTeam(models.Model):
    CS_USER_TEAMS_ID = models.AutoField(primary_key=True)
    fantasy_team = models.ForeignKey(ClassicSeasonFantasyTeam)
    user = models.ForeignKey(User)
    total_score = models.IntegerField(default=0)
    season = models.ForeignKey(Season)
    def __str__(self):
        return '%s' % (self.user.username)

如何实现查询集过滤器?

forms.py

class CaptainsForm(ModelForm):
    class Meta:
        model = ClassicSeasonCaptains

    def __init__(self,*args,**kwargs):
        super(ClassicSeasonCaptains,self).__init__(*args,**kwargs)
        #filter to players that are only in the user's fantasy team
        self.fields['captain'].queryset = ClassicSeasonFantasyTeam.objects.filter()????
        self.fields['vice_captain'].queryset = ?????

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    如果我理解正确,您想限制表单中某个字段的选择。该问题的答案已经给出并且非常好,请参阅:https://stackoverflow.com/a/3420588/2583290

    至于 Queryset 过滤器本身,您需要 Players,所以从 Player.objects.filter() 开始。对于实际的过滤器查询,您需要先清理一下代码。由于玩家如何与您的 FantasyTeam 关​​联,这将过于复杂。

    考虑拥有一个具有角色(“普通”、“子”、“队长”)的 TeamPlayer 类。阅读django docs

    PS:避免使用复数的类名。使用船长而不是船长。 PPS:Captain(s) 可能应该从 Player 或 Person 类继承,而不是拥有 ForeignKey

    【讨论】:

    • 感谢您的建议。在不改变模型结构的情况下,是否有可能过滤掉幻想队中的球员?在查看您发布的另一个问题的答案后,我仍然觉得很难
    猜你喜欢
    • 2021-01-26
    • 2021-05-31
    • 1970-01-01
    • 2011-07-01
    • 2013-03-16
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多