所以我有这个模型:
# -------------------------------------------------------------- Load Drivers Model
class LoadDrivers(models.Model):
driver = models.ForeignKey(User, default=None, null=True, blank=True, on_delete=models.DO_NOTHING, limit_choices_to={'is_driver': True})
load_key = models.ForeignKey(Loads, on_delete=models.DO_NOTHING, related_name="loaddrivers")
driver_type = models.CharField(choices=DriverType.choices, max_length=2, default=None, null=True, blank=True)
# -------------------------------------------------------------- Loads Model
class Loads(models.Model):
bill_to = models.CharField(max_length=50)
price = models.DecimalField(default=None, null=True, blank=True, max_digits=15, decimal_places=2)
truck = models.ForeignKey(Trucks, on_delete=models.DO_NOTHING, null=True, blank=True, related_name="loadtrucks")
trailer = models.ForeignKey(Trailer, on_delete=models.DO_NOTHING, null=True, blank=True, related_name="loadtrailers")
load_number = models.CharField(max_length=50, default=None, unique=True)
notes = models.TextField(max_length=1000, default=None, null=True, blank=True)
我正在构建 DRF API。
现在我正在为此负载制作编辑视图,我创建了序列化器、视图,一切都运行良好,但只有 1 个问题,我真的无法决定如何让用户下拉列表位于前面LoadDrivers 领域:
driver = models.ForeignKey(User, default=None, null=True, blank=True, on_delete=models.DO_NOTHING, limit_choices_to={'is_driver': True})
例如,当我进入编辑视图并想要更改驱动程序时,如何获取该用户下拉列表? 我认为实现此目的的一种方法是创建单独的 API 端点来返回所有用户,然后使用 Javascript 执行一些操作。
没有 DRF,只有表单和 django 模板,我会有 {{ form }} 并且对于驱动程序字段,它将呈现 以及用户下拉列表,其中 'is_driver':True 正如我在 LoadDriver 模型中提到的。
所以这是我的主要问题。
还有来自 Loads 模型的 trailer、truck 字段,我也有同样的问题,我必须获取这些列表,如果我使用 Django 模板,在 EditView 上生成如下:
所以我需要使用 API 获得相同的结果,最佳实践是什么?
正如您所说,您需要第二个 API 端点来列出这些下拉数据。
对于像下拉列表这样的用例,返回尽可能少的字段。
此外,如果您的应用程序中只有这种情况,您可能希望在单个 API 调用中返回拖车和卡车下拉列表。
视图.py
@api_view(["GET"])
def list_users_choices(request):
is_driver = request.query_params.get('is_driver')
query_params = {}
if is_driver is not None:
query_params['is_driver'] = is_driver
user_qs = User.objects.filter(**query_params).only('id', 'username')
return UserSimpleSerializer(user_qs, many=True).data
序列化器.py
class UserSimpleSerializer(serializers.ModelSerializer):
class Meta:
model=User
fields=("id", "username')