2016-12-20 1 views
2

Ich habe die folgende Abfrage, die perfekt funktioniert:Django-Filter select_related()

campaignFixtures = UserSelection.objects.select_related().filter(user=currentUserID,campaignno=currentCampaignNo).order_by('fixtureid__fixturedate')[:1] 

Ich brauche aber ein Feld aus einer anderen Tabelle zu filtern, wie folgt:

campaignFixtures = UserSelection.objects.select_related().filter(user=currentUserID,campaignno=currentCampaignNo,straightredfixture__fixturematchday=18).order_by('fixtureid__fixturedate')[:1] 

Aber ich bin die folgenden Fehler Empfangen:

Cannot resolve keyword 'straightredfixture' into field. Choices are: campaignno, fixtureid, fixtureid_id, teamselection1or2, teamselectionid, teamselectionid_id, user, user_id, userselectionid 

die Modelle sind wie folgt:

class StraightredFixture(models.Model): 
    fixtureid = models.IntegerField(primary_key=True) 
    home_team = models.ForeignKey('straightred.StraightredTeam', db_column='hometeamid', related_name='home_fixtures') 
    away_team = models.ForeignKey('straightred.StraightredTeam', db_column='awayteamid', related_name='away_fixtures') 
    fixturedate = models.DateTimeField(null=True) 
    fixturestatus = models.CharField(max_length=24,null=True) 
    fixturematchday = models.ForeignKey('straightred.StraightredFixtureMatchday', db_column='fixturematchday') 
    spectators = models.IntegerField(null=True) 
    hometeamscore = models.IntegerField(null=True) 
    awayteamscore = models.IntegerField(null=True) 
    homegoaldetails = models.TextField(null=True) 
    awaygoaldetails = models.TextField(null=True) 
    hometeamyellowcarddetails = models.TextField(null=True) 
    awayteamyellowcarddetails = models.TextField(null=True) 
    hometeamredcarddetails = models.TextField(null=True) 
    awayteamredcarddetails = models.TextField(null=True) 
    soccerseason = models.ForeignKey('straightred.StraightredSeason', db_column='soccerseasonid', related_name='fixture_season') 


    def __unicode__(self): 
     return self.fixtureid 

    class Meta: 
     managed = True 
     db_table = 'straightred_fixture' 

class UserSelection(models.Model): 
    userselectionid = models.AutoField(primary_key=True) 
    campaignno = models.CharField(max_length=36,unique=False) 
    user = models.ForeignKey(User, related_name='selectionUser') 
    teamselection1or2 = models.PositiveSmallIntegerField() 
    teamselectionid = models.ForeignKey('straightred.StraightredTeam', db_column='teamselectionid', related_name='teamID') 
    fixtureid = models.ForeignKey('straightred.StraightredFixture', db_column='fixtureid') 


    class Meta: 
     managed = True 
     db_table = 'straightred_userselection' 

Jede Hilfe wäre willkommen, Alan.

Antwort

3

Ich glaube nicht, dass das Problem mit selected_related zusammenhängt. Sie versuchen nur, einen falschen Lookup-Wert zu verwenden. Wie wäre es mit Filtern fixtureid__fixturematchday statt:

UserSelection.objects.select_related().filter(user=currentUserID, campaignno=currentCampaignNo, fixtureid__fixturematchday=18).order_by('fixtureid__fixturedate')[:1] 

Da Sie nur ein einzelnes Objekt erhalten möchten, warum Sie nicht nur .first() verwenden, um ein Objekt anstelle eines queryset mit einem Artikel zu erhalten:

campaignFixture = UserSelection.objects.select_related("fixtureid").filter(...).order_by(...).first() 
+1

Vielen Dank, ich war so nah. Schätzen Sie die zusätzlichen Informationen. –

+1

Wirklich, dies ist ein Hinweis, dass Sie den Feldnamen in Ihrem Modell ändern sollten. –

2

Nach Ihrem Modell, die Beziehung ist die Feestid

UserSelection.objects.select_related().filter(user=currentUserID,campaignno=currentCampaignNo,fixtureid__fixturematchday=18) 
+1

Vielen Dank, ich war so nah. –

+0

@alantingey - keine Sorge, das einzige Mal, wenn Sie den Klassennamen benötigen, ist, wenn Sie über eine umgekehrte Beziehung nachschlagen, in der ein verwandter Name nicht angegeben ist – Sayse

Verwandte Themen