- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
"需要有字段 "clientprofile"的值,然后才能使用此多对多关系-6ren"> "需要有字段 "clientprofile"的值,然后才能使用此多对多关系-我正在尝试实现一个 API,我可以: 返回所有 ClientProfile 对象,其中包含一个包含 Location 对象列表的嵌套 ManytoMany 字段(我并不关心它是 PK 还是实际对象,实-6ren">
我正在尝试实现一个 API,我可以:
能够 POST ClientProfile 对象,并使用 Location 对象的 PK 指定应与其关联的 Location 对象,如下所示:
{
"user": {
"email": "mike@tyson.com"
},
"first_name": "Mike",
"last_name": "Tyson",
"locations": [
1,5,21
]
}
我见过有人对普通 Django 说“你需要实现一个保存方法”。我是 Django 和 Django REST 的新手,所以不确定在哪里或如何为此实现解决方案。
请把我从这场噩梦中拯救出来!
点卡住输出:
appdirs==1.4.0
chardet==2.3.0
Django==1.10.5
django-csvimport==2.5
djangorestframework==3.5.4
packaging==16.8
pyparsing==2.1.10
six==1.10.0
错误:
Traceback (most recent call last):
File "/venv/project/userauth/tests/User.py", line 28, in setUp
self.response = self.client.post(path="/client-profile/", format="json", data=self.data)
File "/venv/lib/python3.5/site-packages/rest_framework/test.py", line 290, in post
path, data=data, format=format, content_type=content_type, **extra)
File "/venv/lib/python3.5/site-packages/rest_framework/test.py", line 212, in post
return self.generic('POST', path, data, content_type, **extra)
File "/venv/lib/python3.5/site-packages/django/test/client.py", line 409, in generic
return self.request(**r)
File "/venv/lib/python3.5/site-packages/rest_framework/test.py", line 279, in request
return super(APIClient, self).request(**kwargs)
File "/venv/lib/python3.5/site-packages/rest_framework/test.py", line 231, in request
request = super(APIRequestFactory, self).request(**kwargs)
File "/venv/lib/python3.5/site-packages/django/test/client.py", line 494, in request
six.reraise(*exc_info)
File "/venv/lib/python3.5/site-packages/django/utils/six.py", line 686, in reraise
raise value
File "/venv/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/venv/lib/python3.5/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/venv/lib/python3.5/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/venv/lib/python3.5/site-packages/rest_framework/views.py", line 483, in dispatch
response = self.handle_exception(exc)
File "/venv/lib/python3.5/site-packages/rest_framework/views.py", line 443, in handle_exception
self.raise_uncaught_exception(exc)
File "/venv/lib/python3.5/site-packages/rest_framework/views.py", line 480, in dispatch
response = handler(request, *args, **kwargs)
File "/venv/project/userauth/views/ClientProfile.py", line 25, in post
serializer.save()
File "/venv/lib/python3.5/site-packages/rest_framework/serializers.py", line 214, in save
self.instance = self.create(validated_data)
File "/venv/project/userauth/serializers/ClientProfile.py", line 20, in create
client_profile = ClientProfile.objects.create(user=user, **validated_data)
File "/venv/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/venv/lib/python3.5/site-packages/django/db/models/query.py", line 397, in create
obj = self.model(**kwargs)
File "/venv/lib/python3.5/site-packages/django/db/models/base.py", line 550, in __init__
setattr(self, prop, kwargs[prop])
File "/venv/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 499, in __set__
manager = self.__get__(instance)
File "/venv/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 476, in __get__
return self.related_manager_cls(instance)
File "/venv/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 783, in __init__
(instance, self.source_field_name))
ValueError: "<ClientProfile: mike@tyson.com>" needs to have a value for field "clientprofile" before this many-to-many relationship can be used.
型号:
class ClientProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='client_profile')
enabled = models.BooleanField(_('Enabled?'), default=False)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
locations = models.ManyToManyField(Location, related_name='client_profile')
def __str__(self):
return self.user.email
class Location(models.Model):
company = models.ForeignKey(Company)
display_name = models.CharField(max_length=50, null=True)
address1 = models.CharField(max_length=50, null=True)
address2 = models.CharField(max_length=50, null=True)
city = models.CharField(max_length=50, null=True)
county = models.CharField(max_length=50, null=True)
postcode = models.CharField(max_length=50, null=True)
country = models.CharField(max_length=50, null=True)
tel = models.CharField(max_length=50, null=True)
email = models.CharField(max_length=50, null=True)
序列化器:
class ClientProfileSerializer(serializers.ModelSerializer):
user = UserSerializer(required=True)
locations = LocationSerializer(required=False, many=True)
class Meta:
model = ClientProfile
fields = ('id', 'user', 'first_name', 'last_name', 'locations')
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User.objects.create(email=user_data['email'], is_client=True)
client_profile = ClientProfile.objects.create(user=user, **validated_data)
return client_profile
class LocationSerializer(serializers.ModelSerializer):
class Meta:
model = Location
fields = ('id', 'company', 'display_name', 'address1', 'address2',
'city', 'county', 'postcode', 'country', 'tel', 'email')
浏览次数:
class ClientProfileList(APIView):
"""
List all ClientProfiles, or create a new ClientProfile.
"""
def get(self, request, format=None):
if self.request.user.is_client:
client_profiles = ClientProfile.objects.all()
serializer = ClientProfileSerializer(client_profiles, many=True)
return Response(serializer.data)
else:
return Response(status=status.HTTP_401_UNAUTHORIZED)
def post(self, request, format=None):
serializer = ClientProfileSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ClientProfileDetail(APIView):
"""
Retrieve, update or delete a ClientProfile instance.
"""
def get_object(self, pk):
try:
return ClientProfile.objects.get(pk=pk)
except ClientProfile.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
client_profile = self.get_object(pk)
serializer = ClientProfileSerializer(client_profile)
return Response(serializer.data)
def put(self, request, pk, format=None):
client_profile = self.get_object(pk)
serializer = ClientProfileSerializer(client_profile, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
client_profile = self.get_object(pk)
client_profile.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
class LocationList(APIView):
"""
List all Locations, or create a new Location.
"""
def get(self, request, format=None):
if self.request.user.is_authenticated:
if self.request.user.is_client:
locations = Location.objects.all()
serializer = LocationSerializer(locations, many=True)
return Response(serializer.data)
else:
return Response(status=status.HTTP_403_FORBIDDEN)
else:
return Response(status=status.HTTP_401_UNAUTHORIZED)
def post(self, request, format=None):
serializer = LocationSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class LocationDetail(APIView):
"""
Retrieve, update or delete a Location instance.
"""
def get_object(self, pk):
try:
return Location.objects.get(pk=pk)
except Location.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
location = self.get_object(pk)
serializer = LocationSerializer(location)
return Response(serializer.data)
def put(self, request, pk, format=None):
location = self.get_object(pk)
serializer = LocationSerializer(location, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
location = self.get_object(pk)
location.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
最佳答案
具有 ManyToMany
字段的 Django 模型必须先保存,然后才能添加相关实例。 (要在 ManyToMany 关系中添加条目,Django 需要父模型实例 pk,该实例仅在创建模型后设置。)
因此,您必须先保存您的 ClientProfile,然后才能添加任何相关的 Location 实例。
要修复此错误,只需更新您的 ClientProfileSerializer.create
方法:
class ClientProfileSerializer(serializers.ModelSerializer):
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User.objects.create(email=user_data['email'], is_client=True)
locations = validated_data.pop('locations')
client_profile = ClientProfile.objects.create(user=user, **validated_data)
client_profile.locations.add(*locations)
return client_profile
关于python - Django Rest - "<ClientProfile: mike@tyson.com>"需要有字段 "clientprofile"的值,然后才能使用此多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43166729/
在有些场景下,我们需要对我们的varchar类型的字段做修改,而修改的结果为两个字段的拼接或者一个字段+字符串的拼接。 如下所示,我们希望将xx_role表中的name修改为name+id。
SELECT incMonth as Month, SUM( IF(item_type IN('typ1', 'typ2') AND incMonth = Month, 1, 0 ) )AS
我最近读到 volatile 字段是线程安全的,因为 When we use volatile keyword with a variable, all the threads read its va
我在一些模型中添加了一个 UUID 字段,然后使用 South 进行了迁移。我创建的任何新对象都正确填充了 UUID 字段。但是,我所有旧数据的 UUID 字段为空。 有没有办法为现有数据填充 UUI
刚刚将我的网站从 mysql_ 更新为 mysqli,并破坏了之前正常运行的查询。 我试图从旋转中提取 id,因为它每次都会增加 1,但我不断获取玩家 id,有人可以告诉我我做错了什么吗?我尝试了将
我在 Mac OS X 上使用带有 Sequel Pro 的 MySQL。我想将一个表中的一个字段(即名为“GAME_DY”的列)复制到另一个名为“DAY_ID”的表的空字段中。两个表都是同一数据库的
问题: 是否有可能有一个字段被 JPA 保留但被序列化跳过? 可以实现相反的效果(JPA 跳过字段而序列化则不会),如果使用此功能,那么相反的操作肯定会很有用。 类似这样的事情: @Entity cl
假设我有一个名为“dp”的表 Year | Month | Payment| Payer_ID | Payment_Recipient | 2008/2009 | July
我将尝试通过我的 Raspberry Pi 接入点保证一些 QoS。 开始之前,我先动手:我阅读了有关 tcp、udp 和 ip header 的内容。在IP header description我看
如果你能弄清楚如何重命名这个问题,我愿意接受建议。 在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能设置的字段构造函数前 body 跑。这可以在声明中(通常用于类中的静态常量)
你怎么样? 我有两个带有两个字段的日期选择器 我希望当用户选择 (From) 时,第二个字段 (TO) 将是 next day 。比如 booking.com 例如:当用户选择From 01-01-2
我想我已经看到了这个问题的一些答案,这些答案可能与我需要的相差不远,但我对 mysql 的了解还不够确定,所以我会根据我的具体情况提出问题。 我有一个包含多个表的数据库,为此,如果“image”表上的
我在 mySQL 数据库中有 2 个表: customers ============ customer_id (1, 2 ) customer_name (john, mark) orders ==
我正在开发一个员工目标 Web 应用程序。 领导/经理在与团队成员讨论后为他们设定目标。这是一年/半年/季度,具体取决于组织遵循的评估周期。 现在的问题是添加基于时间段的字段或存档上一季度/年度数据的
我正在寻找允许内容编辑器从媒体库中选择多个文件的东西,这些文件将在渲染中列出。他们还需要能够上传文件和搜索。它必须在页面编辑器(版本 8 中称为体验编辑器)中工作。 到目前为止我所考虑的: 一堆文件字
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
我想知道是否有一些步骤/解决方案可以处理错误消息并将它们放入 Pentaho 工具中的某个字符串或字段中?例如,如果连接到数据库时发生某些错误,则将该消息从登录到字符串/字段。 最佳答案 我们在作业的
如何制作像短信应用程序一样的“收件人”字段?例如,右侧有一个“+”按钮,当添加某人时,名称将突出显示并可单击,如圆角矩形等。有没有内置的框架? 最佳答案 不,但请参阅 Three20 的 TTMess
是否可以获取记录的元素或字段的列表 通过类型信息类似于类的已发布属性的列表吗? 谢谢 ! 最佳答案 取决于您的delphi版本,如果您使用的是delphi 2010或更高版本,则可以使用“新rtti”
我正在构建一个 SQLite 数据库来保存我的房地产经纪人的列表。我已经能够使用外键来识别每个代理的列表,但我想在每个代理的记录中创建一个列表;从代理商和列表之间的一对一关系转变为一对多关系。 看这里
我是一名优秀的程序员,十分优秀!