Как преобразовать отношения многие ко многим в набор запросов? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть модель в Django, связанная с другой моделью с ManyToManyField .Я хотел бы получить все элементы ManyToManyField .

Вот модели:

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 я сделал следующее:

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

Однако, когда я являюсь администратором Django для этого Персонал , у вас есть: enter image description here

Ответ

По сути, изображение на изображении не имеет ничего общего со связанными DossierMedical объектами.Чтобы добавить объекты, вы должны изменить страницу администратора следующим образом:

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

После этого вам просто нужно зарегистрировать ее и перейти на автоматически созданную страницу администратора, которую предоставляет django.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Не используйте 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 смоделируйте и поместите его в поле «inlines» PersonnelAdmin, как описано здесь .

0 голосов
/ 07 февраля 2019

Просто попробуйте с фильтром.p = Personnel.objects.filter (pk = User.objects.get (pk = 1))

...