Search code examples
pythondjangomanytomanyfield

Django admin only show M2M elements once


I have a "training" model containing a ManyToManyField to a "trainer" model.

Let's take the exemple "training 1" has 3 trainers "A" "B" and "C". And "training 2" only has one trainer "A".

In my admin panel when I want to see all the trainings, it shows me something like:

"training 1" : "A"

"training 1" : "B"

"training 1" : "C"

"training 2" : "A"

Because I already did an inline in order to get all the trainers from one entity, I would like it to only show one of each training, so something like:

"training 1" : "A"

"training 2" : "A"

My models look like this :

class Training(models.Model):
    name = models.CharField(
        max_length=60
    )

    trainer = models.ManyToManyField(
        Trainer,
        through='Training_trainer'
    )


class Trainer(models.Model):
    first_name = models.CharField(
        max_length=60
    )

    last_name = models.CharField(
        max_length=60
    )

And my admin.py look like this :

class Training_trainerInline(admin.TabularInline):
    model = Training.trainer.through
    extra = 3


class TrainingAdmin(admin.ModelAdmin):
    list_display = ('name', 'get_trainer')
    list_filter = ('trainer',)
    fieldsets = (
        (None, {'fields': ('name',)}),
    )

    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('name', 'trainer')}
         ),
    )

    search_fields = ('name', 'trainer',)
    ordering = ('name', 'trainer',)

    inlines = [Training_trainerInline, ]

    def get_trainer(self, obj):
        return "\n".join([str(p.trainer) for p in Training_trainer.objects.filter(training=obj)[:1]])

    get_trainer.short_description = 'Trainer'

Solution

  • Testing by trial and error, I finally found out what was causing the problem:

    In admin.py, this line was the problem

    ordering = ('name', 'trainer',)
    

    By removing the ordering by 'trainer', Django show each training only once.

    ordering = ('name',)