Является ли 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, и я не склонен обходить что-то в моем коде, которое пахнет.
Благодарен за любую помощь и рад предоставить больше информации по мере необходимости.