Как передать вложенный объект foreignkey в другую модель?

Я в тупике уже несколько дней; надеюсь, кто-нибудь из вас, волшебники, сможет вытащить меня из этого затруднительного положения...

У меня есть модель под названием ExtraSlot

class ExtraSlot(models.Model):
        .......
    employee = models.ForeignKey(Employee, on_delete = models.CASCADE, related_name="employee")

это сериализатор

class ExtraSlotSerializer(serializers.ModelSerializer):
         
        employee = EmployeeSerializer(many=True) <-- If I add this it tries to iterate through and errors 
             out

    class Meta:
        model = ExtraSlot
        fields = (..... 'employee')
                fields = ('__all__') <- also used this to no avail
        depth = 3

Я пытаюсь добавить сотрудника в модель; в панели администратора все в порядке. Объект сотрудника можно выбрать. DRF api ничего не показывает; я читал, что ввод списка HTML не поддерживается, что нормально, но поле сотрудника в качестве ввода (даже в необработанном формате) не отображается вообще.

Employee extends User (AbstractBaseUser) - вот ошибка списка, если я попробую many=true и передам весь сериализатор.

TypeError: 'Employee' object is not iterable (если я попробую передать EmployeeSerializer с many=True; что имеет смысл.)

employee = EmployeeSerialzer() - передает весь объект, как будто я хочу создать новый?!

Я хочу позволить пользователю подписать сотрудника на экстраслот.

Помогите, пожалуйста!

Разобрался...

class ExtraSlotSerializer(serializers.ModelSerializer):

class Meta:
    model = ExtraSlot
    fields = ('__all__')
    depth = 3 <---

Проблема связана с параметром depth. При его применении даже при глубине 1 происходит обход всей глубины отношений. Мы просим выполнить итерацию по любому вложенному объекту и вернуть требуемый уровень глубины.

Поэтому ForeignKey/Many-to-one расширяет весь объект, не позволяя передать идентификатор первичного ключа (posted).

Когда мы удаляем параметр глубины, поле для идентификатора объекта становится доступным и может быть использовано.

Надеюсь, это поможет кому-нибудь в будущем.

Вернуться на верх