如何将多对多关系转换为查询集?

2024-09-28 12:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Django有一个模型和另一个模型有一个manyfield。我想检索许多领域的所有元素。你知道吗

以下是模型:

class Personnel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    adresse = models.CharField(max_length=150, verbose_name=_("Adresse"))
    telephone = models.CharField(max_length=15, verbose_name=_("Téléphone"))
    dossiermedical = models.ManyToManyField("DossierMedical",  related_name=_("travaille_sur"))

class DossierMedical(models.Model):
    patient = models.OneToOneField("Patient", on_delete=models.CASCADE)

在Django shell中,我执行了以下操作:

p = Personnel.objects.get(pk=User.objects.get(pk=1))
d = p.dossiermedical.all()
<QuerySet []>

但是,当我是这个人员的Django管理员时,您有:enter image description here

响应

基本上,图像中的显示与链接的文档医学对象无关。要添加对象,您应该修改管理页面,如下所示:

class PersonnelAdmin(admin.ModelAdmin):
     model= Personnel
     filter_horizontal = ('dossiermedical',)

之后,您只需注册它并进入django提供的自动生成的管理页面。你知道吗


Tags: djangoname模型modelonmodelsdeletemax
2条回答

用过滤器试试。 p=人员.对象.过滤器(主键)=User.objects.get(峰值=1)

不要再使用ModelName.objects.get(pk=1),因为它会引发异常。改用ModelName.objects.filter(pk=1).first()django.shortcuts.get_object_or_404(ModelName, pk=1)。你知道吗

对于您的模型,重写__str__函数是一种很好的做法,如下所示:

class Personnel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    adresse = models.CharField(max_length=150, verbose_name=_("Adresse"))
    telephone = models.CharField(max_length=15, verbose_name=_("Téléphone"))
    dossiermedical = models.ManyToManyField("DossierMedical",  related_name=_("travaille_sur"))

    def __str__(self):
        return f'#{self.pk} {self.user.full_name}'

class DossierMedical(models.Model):
    patient = models.OneToOneField("Patient", on_delete=models.CASCADE)

    def __str__(self):
        return f'#{self.pk} {self.patient.full_name}'

您还可以为DossierMedical模型添加内联,并将其放置到PersonnelAdmin的“inlines”字段中,如here所述。你知道吗

相关问题 更多 >

    热门问题