Как в django ограничить выбор внешнего поля на основе другого поля в той же модели?

У меня есть эти модели (я ограничил количество полей только этими необходимо)

class unit(models.Model):
    name = models.CharField(max_length=200)

class project(models.Model):
    name = models.CharField(max_length=200)

class location(address):
    project = models.ForeignKey(project)

class project_unit(models.Model):
    project = models.ForeignKey(project)         
    unit = models.ForeignKey(unit)

class location_unit(models.Model):
    project = models.ForeignKey(project)    
      #Limit the selection of locations based on which project has been selected
    location = models.ForeignKey(location)
      #The same here for unit. But I have no idea how.
    unit = models.ForeignKey(project_unit)       

Моя голова новичка просто не может понять, как ограничить два поля, местоположение и единицу, в модели location_unit, чтобы показать только те варианты, которые относятся к выбранному проекту в location_unit. Должен ли я переопределить форму модели и сделать там запрос, или я могу использовать limit_choices_to. В любом случае, я не смог попробовать оба

Edit: Чтобы уточнить, я хочу, чтобы это произошло в Django Admin. Я также пробовал formfield_for_foreignkey, но все равно не могу.

РЕДАКТИРОВАТЬ 2:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "unit":
        kwargs["queryset"] = project_unit.objects.filter(project=1)
        return db_field.formfield(**kwargs)
    return super(location_unit_admin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Приведенный выше фрагмент кода работает. Но, конечно, я не хочу, чтобы проект указывал на 1. Как мне ссылаться на модели project_id?

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "unit":
        kwargs["queryset"] = project_unit.objects.filter(project=1)
        return db_field.formfield(**kwargs)
    return super(location_unit_admin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Приведенный выше фрагмент кода работает. Но, конечно, я не хочу, чтобы проект указывал на 1. Как мне ссылаться на модели project_id?

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == "unit":
        kwargs["queryset"] = project_unit.objects.filter(project=1)
        return db_field.formfield(**kwargs)
    return super(location_unit_admin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Приведенный выше фрагмент кода работает. Но, конечно, я не хочу, чтобы проект указывал на 1. Как мне ссылаться на модели project_id? Я пробовал это:

kwargs["queryset"] = project_unit.objects.filter(project=self.model.project.project_id)

Но это не работает (на самом деле я перепробовал много вариантов, да, я новичок в django)

11
задан Brian 8 November 2010 в 14:01
поделиться