我正在使用django-rest-framework,我需要在URL文件中映射两个具有相同url的通用视图(iḿ已经使用了URL而不是Routes):
我需要在一个url(例如/ api/places/222)中允许GET,PUT和DELETE动词,并允许每个人使用相关的Entity Place获取每个字段,但只允许使用相同的url更新(PUT)一个字段.
放置实体:
- id (not required in PUT)
- name (required always)
- date (not required in PUT but required in POST)
Run Code Online (Sandbox Code Playgroud)
网址
url(r'^api/places/(?P<pk>\d+)/?$', PlacesDetail.as_view(), name='places-detail'),
Run Code Online (Sandbox Code Playgroud)
我尝试使用RetrieveDestroyAPIView和UpdateAPIView,但我不能只使用一个URL.
我想实现一种 Django 模型的常量字段。我希望在创建模型实例时设置该字段(通过 REST 框架 API),但在更新此字段时必须禁止更改。在 Django 本身或 REST framework 序列化器选项中是否有一种优雅的方法来做到这一点?
我有一个字段owner是一个ForeignKey以User模型。
该字段是required在创建时。但是以后就不能改了。
如何制作字段Non-Editable?除了创建多个序列化程序还有其他方法吗?
class GarageDetails(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, )
name = models.CharField(_('Garage Name'), max_length=254, blank=False, null=False, unique=True)
price = models.IntegerField(_('Price'), blank=False)
available_from = models.TimeField(_('Available From'), default=datetime.time(6, 00), blank=False)
available_till = models.TimeField(_('Available till'), default=datetime.time(18, 00), blank=False)
description = models.TextField(_('Garage Description'), blank=True, null=True)
create_date = cmodels.UnixTimestampField(_('Date Added'), auto_now_add=True)
update_date = cmodels.UnixTimestampField(_('Date Added'), auto_created=True)
is_available = models.BooleanField(_('Available'), default=True)
Run Code Online (Sandbox Code Playgroud)
class UserFKSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ('id', 'name', 'email', …Run Code Online (Sandbox Code Playgroud) 我正在创建UserSerializer并希望允许用户创建新帐户但禁止他们更改用户名。read_only我可以应用一个属性,但用户在创建新用户名时将无法设置用户名。但没有它它允许我改变它。required不幸的是,还有一个属性不能与 read_only 一起使用。没有其他相关属性。一种解决方案是创建 2 个不同的序列化程序,一个用于创建 User,另一个用于更改他,但这似乎是丑陋和错误的做法。您对如何在不编写 2 个序列化程序的情况下实现这一目标有什么建议吗?
感谢您的任何建议。
PS:我使用的是 python3.6 和 django2.1
编辑:我正在使用generics.{ListCreateAPIView|RetrieveUpdateDestroyAPIView}类来查看视图。像这样:
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetails(generics.RetrieveUpdateAPIView):
# this magic means (read only request OR accessing user is the same user being edited OR user is admin)
permission_classes = (perm_or(ReadOnly, perm_or(IsUserOwner, IsAdmin)),)
queryset = User.objects.all()
serializer_class = UserSerializer
Run Code Online (Sandbox Code Playgroud)
EDIT2:有一个重复的问题(可能我的是一式两份)在这里
我有一个序列化器。我想限制更新字段。我该怎么做呢?
class ABCSerializer(serializers.ModelSerializer):
class Meta:
"""Meta."""
model = ModelA
fields = ('colA', 'colB', 'colC',)
Run Code Online (Sandbox Code Playgroud)
colA是创建对象时的必填字段。但是,不应允许其更新。我怎样才能做到这一点??