Search code examples
pythondjangodjango-class-based-views

Auto list fields from many-to-many model


I've created a model of analysis types and then I created a table that groups several analyses into one group:

class AnalysisType(models.Model):
    a_name = models.CharField(max_length=16,primary_key=True)
    a_measur = models.CharField(max_length=16)
    a_ref_min = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
    a_ref_max = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)
    # analysis_group = models.ForeignKey(AnalysysGroup, on_delete=models.CASCADE, default=1)
    def __str__(self):
        return f"{self.a_name} - {self.a_measur}"

class AnalysysGroup(models.Model):
    group_name = models.CharField(max_length=32)
    analysis = models.ManyToManyField(AnalysisType, blank=True)
    def __str__(self):
        return f"{self.group_name}"

I want to have the option to multiply add values via the admin panel (I.E. I chose Analysis type then below appear fields to fill)

class PatientGroupAnalysis(models.Model):
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
    analysis_date = models.DateTimeField()
    analysis_type = models.ForeignKey(AnalysysGroup, on_delete=models.CASCADE, default=1)
    # amalysis_data = ???
    def __str__(self):
        return f"{self.patient}:  {self.analysis_date} - {self.analysis_type} - {self.analysis_data}"

I tried to use analysis_data = analysis.type.objects.all() and etc. but that's the wrong way.


Solution

  • Try this:

    Admin panel with StackedInline

    from django.contrib import admin
    from .models import AnalysisType, PatientGroupAnalysis
    
    # Register your models here.
    
    class PatientGroupAnalysisInline(admin.StackedInline):
        model = PatientGroupAnalysis
    
    
    @admin.register(AnalysisType)
    class AnalysisTypeAdmin(admin.ModelAdmin):
        list_display = ["id", "a_name", "a_measur", "a_ref_min", "a_ref_max"]
        search_fields = ("id", "a_name")
        inlines = [PatientGroupAnalysisInline]