Является ли include_fk=True антипаттерном в REST API фляжки?

Я разбираюсь с фляжкой (-классом), зефиром, sqlalchemy, webargs и др. У меня есть отношения один ко многим, где один User может иметь много Deliveries, Когда я создаю Delivery, Я бы хотел POST /delivery/ с идентификатором пользователя внешнего ключа в данных { user_id: 456 },

Теперь немного кода, смотрите комментарии FOO а также BAR:

class Delivery(BaseModel):    
    status = db.Column(db.Enum("new", "dispatched", nullable=False))
    # ... (some other Columns)

    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)

class DeliverySchema(ma.ModelSchema):
    class Meta:
        include_fk = True  # FOO
        model = Delivery
        strict = True

    # UserSchema has deliveries as Nested
    user = ma.HyperlinkRelated("UsersView:get")

delivery_schema = DeliverySchema()

class DeliveriesView(FlaskView):
    @use_kwargs(delivery_schema.fields)
    def post(self, **kwargs):
        # BAR
        print(', '.join(['{}={!r}'.format(k, v) for k, v in kwargs.items()]))
        delivery = Delivery(user_id=kwargs["user_id"])
        db.session.add(delivery)
        db.session.commit()
        return delivery_schema.jsonify(delivery), 201

Если я не include_fk = True, kwargs не содержит user_id, Но как мне обновить поле в моей базе данных, если оно не было передано?

Это похоже на общий случай использования, и я предполагаю, include_fk = True будет по умолчанию, если он должен был использоваться много. Я чувствую, что что-то упустил, я просто не уверен, что.

альтернативно POST /delivery/456/ работает, но, насколько я понимаю, менее предпочтительно, чтобы новые данные были частью URL, и я не склонен обходить что-то в моем коде, которое пахнет.

Благодарен за любую помощь и рад предоставить больше информации по мере необходимости.

0 ответов

Другие вопросы по тегам