Как получить доступ к родительскому объекту из админки tabularinline в админке Django

Мне нужно получить доступ к родительскому объекту элемента, чтобы иметь возможность фильтровать выпадающие поля Fk внутри инлайн-объекта на основе того, что он является родителем.

вот мой код :

models.py

class Match(models.Model):
    date_time = models.DateTimeField()
    home_team = models.ForeignKey('teams.Team',related_name="home_team_team",on_delete=models.PROTECT)
    away_team = models.ForeignKey('teams.Team',related_name="away_team_team",on_delete=models.PROTECT)
    league = models.ForeignKey(League,on_delete=models.CASCADE,null=True)

class Goal(models.Model):
    match = models.ForeignKey(Match,on_delete=models.CASCADE)
    date_time = models.DateTimeField()
    team = models.ForeignKey("teams.Team",on_delete=models.PROTECT,null=True,blank=True)
    player = models.ForeignKey('players.PlayerProfile',related_name="goal_maker",on_delete=models.PROTECT,null=True,blank=True)
    assistant = models.ForeignKey('players.PlayerProfile',related_name="goal_assist",on_delete=models.PROTECT,null=True,blank=True)

admin.py

#this is my inline class
class GoalInline(nested_admin.NestedTabularInline):
    model = Goal
    fields =  ['date_time','team','player','assistant']
    extra = 1
    show_change_link = True


    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        print(f"data {self.model}")
        if db_field.name == "team":
            kwargs["queryset"] = Team.objects.filter() #i need to perform filtering here
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

#my parent class
@admin.register(Match)
class MatchAdmin(nested_admin.NestedModelAdmin):
    # form = LeagueForm
    readonly_fields = ['date_time','home_team','away_team','league']
    list_display = ["league","home_team","away_team",]
    search_fields=["home_team","away_team","league"]
    list_filter=['league','date_time',"home_team","away_team"]
    inlines=[GoalInline]

    def get_inlines(self, request, obj=None):
        if obj:
            return [GoalInline]
        else:
            return []

Находит решения, получая данные о родителях из пути kwargs


class GoalInline(nested_admin.NestedTabularInline):
    model = Goal
    fields = ['date_time', 'team', 'player', 'assistant']
    extra = 1
    show_change_link = True
    def get_parent_object_from_request(self, request):
        """
        Returns the parent object from the request or None.

        Note that this only works for Inlines, because the `parent_model`
        is not available in the regular admin.ModelAdmin as an attribute.
        """
        resolved = resolve(request.path_info)
        the_parent_object_id = resolved.kwargs['object_id']
        the_object = self.parent_model.objects.get(id=the_parent_object_id)
        return the_object

Тогда я могу использовать его внутри фильтра:

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        parent = self.get_parent_object_from_request(request)
        home_team_object = parent.home_team
        away_team_object = parent.away_team
        if db_field.name == "team":
            kwargs["queryset"] = Team.objects.filter(Q(away_team_team=parent) | Q(home_team_team=parent))
        if db_field.name == "player":
            parent = self.get_parent_object_from_request(request)
            print(parent)
            kwargs["queryset"] = PlayerProfile.objects.filter(Q(team=away_team_object) | Q(team=away_team_object))
        if db_field.name == "assistant":
            parent = self.get_parent_object_from_request(request)
            print(parent)
            kwargs["queryset"] = PlayerProfile.objects.filter(Q(team=away_team_object) | Q(team=home_team_object))
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

Вернуться на верх