【问题标题】:Mandatory many to many relationship in DjangoDjango中的强制多对多关系
【发布时间】:2019-12-04 16:00:15
【问题描述】:

假设我有一个模型Car(汽车不属于自己,可能由乘客共享)和一个模型Passenger(乘客包括公交车司机)。

# <app>/models.py
from django.db import models


class Car(model.Model):
    ...


class Passenger(models.Model):
    cars = models.ManyToManyField(Car)
    ...

模型可通过DRF 和管理界面进行读/写。

如果我尝试在管理界面中创建 Car 而不引用 Passenger 我会收到通知 This field is required. 这对我来说已经足够验证默认行为了。但是在创建Car (POST) 期间通过 DRF 似乎无法分配Passenger

通过 DRF 创建Car 时,如何强制每辆车至少有一名乘客,并且可能有多名乘客(强制多对多关系)?

【问题讨论】:

    标签: python sql django-models


    【解决方案1】:

    在数据库级别,m2m 关系是使用在关系的每一端都有外键的中间表来实现的。这意味着在您创建汽车和乘客记录之前,您不能在给定汽车和给定乘客之间创建 m2m 关系(否则您不能拥有 id),因此您不能因为缺少一位乘客。

    在您的示例中,您至少有一名“特殊”乘客,即司机。在这种情况下,显而易见的解决方案是为驾驶员提供乘客的外键,并为乘客提供乘客的 m2m 关系。通过这种方式,您可以强制设置“驱动程序”fk,这样您就可以确定您始终至少有一个驱动程序。

    FWIW 这里绝对没有 django 或 python 特定的东西,这是简单的关系数据库设计。

    【讨论】:

    • 我从来没有这个模型设计,所以我不知道。然而,这完全合乎逻辑。但是就我而言,我没有“特殊”乘客。因此,我无法在创建汽车期间强制执行至少一名分配的乘客,并且必须在其他地方进行验证,我猜在应用程序逻辑中......我通过 DRF 与 JS 前端集成。我应该把验证放在哪里?
    • RESTful API 是无状态的。我如何“强制”或至少与 API 用户沟通以创建乘客、创建汽车并使用其乘客更新汽车。
    • 我调整了问题。我的问题仍然是 w.r.t。仅现在 DRF。
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 2021-09-11
    • 2011-08-22
    • 2011-06-02
    • 2012-05-15
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多