Как я могу ограничить выбор связанных объектов в Django? - PullRequest
2 голосов
/ 27 октября 2011

Я пытаюсь использовать django для организации и управления данными клинических исследований. Я думаю, что я могу обойтись только с интерфейсом администратора, так как это закулисная база данных, которая не должна быть публичной. Я могу программировать, но никогда не работал на python, поэтому я застреваю на простых вещах.

У меня есть пациенты, которые делают несколько визитов. Каждый визит включает в себя несколько сканов. В интерфейсе администратора я вижу все посещения и все сканы в виде строк на странице каждого пациента. Тем не менее, при добавлении нового сканирования, как я могу сделать так, чтобы выбор посещения, с которым он ассоциировался, ограничивался посещениями для данного пациента, а не других пациентов?

Модели (упрощенно):

class Patient(models.Model):
  patient_id = models.CharField(max_length=16, primary_key=True)
  first_name = models.CharField(max_length=64)
  last_name = models.CharField(max_length=64)

class Visit(models.Model):
  patient = models.ForeignKey(Patient)
  visit_date = models.DateTimeField()

class Scan(models.Model):
  patient = models.ForeignKey(Patient)
  visit = models.ForeignKey(Visit)
  scan_type = models.CharField(max_length=32)

Большое спасибо за любую помощь ...

Ответы [ 2 ]

1 голос
/ 28 октября 2011

Два примера только немного отличаются:

Первый:

class ScanInlineAdmin(admin.TabularAdmin):
    model = Scan
    formset = ScanInlineFormset

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "visit":
            patient = self.get_object(kwargs['request'], Patient)
            kwargs["queryset"] = Visit.objects.filter(patient=patient)
        return super(ScanInlineAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)   

    def get_object(self, request, model):
        object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
        try:
            object_id = int(object_id)
        except ValueError:
            return None
        return model.objects.get(pk=object_id)

Второй:

class ScanInline(admin.TabularInline):
    model = Scan
    formset = ScanInlineFormset

    def formfield_for_dbfield(self, field, **kwargs):
        if field.name == 'visit':
            # Note - get_object hasn't been defined yet
            patient = self.get_object(kwargs['request'], Patient)
            vists = Visit.objects.filter(patient=patient)
            return forms.ModelChoiceField(queryset=visits)
        return super(ScanInline, self).formfield_for_dbfield(field, **kwargs)

    def get_object(self, request, model):
        object_id = request.META['PATH_INFO'].strip('/').split('/')[-1]
        try:
            object_id = int(object_id)
        except ValueError:
            return None
        return model.objects.get(pk=object_id)

Вам может пригодиться эта статья .Я предполагаю, что на странице пациента администратор редактирует / просматривает, где вы хотите ввести новое сканирование.Это правильно?

1 голос
/ 28 октября 2011

Я думаю, что метод formfield_for_foreignkey будет вам полезен. Вы можете реализовать это в классе администратора. См. документы .

...