【问题标题】:Django POST request issue with model模型的 Django POST 请求问题
【发布时间】:2017-07-13 01:02:28
【问题描述】:

我有一个模型Condition,它有一个字段symptoms,它接受多个不同的Symptoms 对象。每当我发出 POST 请求以创建 Condition 对象时,都会收到以下错误:

'Condition: epilepsy' 需要有字段“condition”的值才能使用这种多对多关系。

上述“条件:癫痫”嵌套在 之间,但发布时存在格式问题。

这是我的 Condition 模型:

class Condition(models.Model):
class Treatment():
    SURGERY, NON_INVASIVE, PRESCRIPTION_MEDICINE, NONE = range(4)
    CHOICES = (
        (SURGERY, 'Surgery'),
        (NON_INVASIVE, 'Non-Invasive Treatment'),
        (PRESCRIPTION_MEDICINE, 'Prescription Medicine'),
        (NONE, 'None')
        )
class Medicalfield(models.Model):
    ONCOLOGY, CARDIOLOGY, NEPHROLOGY, PEDIATRICS, ENDOCRONOLOGY, PSYCHOLOGY = range(6)
    CHOICES = (
        (ONCOLOGY, 'Oncology'),
        (CARDIOLOGY, 'Cardiology'),
        (NEPHROLOGY, 'Nephrology'),
        (PEDIATRICS, 'Pediatrics'),
        (ENDOCRONOLOGY, 'Endocronology'),
        (PSYCHOLOGY, 'Psychology')
        )

name = models.CharField(max_length=200)
contagious = models.BooleanField()
treatable = models.BooleanField()
treatment = models.IntegerField(choices=Treatment.CHOICES, null=True)
severeity = models.IntegerField(default=0)
symptoms = models.ManyToManyField('Symptom', blank=True)
medicalfield = models.IntegerField(choices=Medicalfield.CHOICES, null=True)

new = ConditionManager()

def __unicode__(self):
    return u"%s" % ( self.name )

这是我的序列化器

class ConditionSerializer(serializers.ModelSerializer):

def create(self, validated_data):
attrs = validated_data
request = self.context['request']
return Condition.new.create_condition(**attrs)

class Meta:
model = Condition
fields = ('id', 'treatment', 'name', 'contagious', 'treatable', 'treatment', 'severeity', 'symptoms', 'medicalfield')

这里是经理

class ConditionManager(models.Manager):
use_in_migrations = True
use_for_related_fields=True

def create_condition(self, *args, **kwargs):
    condition_obj = conditions.models.Condition(name=kwargs['name'], contagious=kwargs['contagious'], treatable=kwargs['treatable'], treatment=kwargs['treatment'], severeity=kwargs['severeity'], symptoms=kwargs['symptoms'], medicalfield=kwargs['medicalfield'])
    condition_obj.save()
    return condition_obj

这里是视图

@api_view(['POST'])
@permission_classes((AllowAny, ))
def create_condition(request):
context = {'request': request}
symptoms = request.data['symptoms']
symptoms = Symptom.objects.filter(name__in=symptoms)
s = []
for symptom in symptoms:
    s.append(symptom.pk)
request.data['symptoms'] = s

serializer = ConditionSerializer(data=request.data, context=context)
if serializer.is_valid():
    serializer.save()
    return response.Response(serializer.data, status=201)
return response.Response(serializer.errors, status=400)

Traceback(最近一次通话最后一次):

File "/Library/Python/2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
response = get_response(request)
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/rest_framework/views.py", line 477, in dispatch
response = self.handle_exception(exc)
File "/Library/Python/2.7/site-packages/rest_framework/views.py", line 437, in handle_exception
self.raise_uncaught_exception(exc)
File "/Library/Python/2.7/site-packages/rest_framework/views.py", line 474, in dispatch
response = handler(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/rest_framework/decorators.py", line 52, in handler
return func(*args, **kwargs)
File "/Users/user/medicalrecords/conditions/views.py", line 28, in create_condition
serializer.save()
File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 214, in save
self.instance = self.create(validated_data)
File "/Users/user/medicalrecords/conditions/serializers.py", line 24, in create
return Condition.new.create_condition(**attrs)
File "/Users/user/medicalrecords/conditions/managers.py", line 17, in create_condition
condition_obj = conditions.models.Condition(name=kwargs['name'], contagious=kwargs['contagious'], treatable=kwargs['treatable'], treatment=kwargs['treatment'], severeity=kwargs['severeity'], symptoms=kwargs['symptoms'], medicalfield=kwargs['medicalfield'])
File "/Library/Python/2.7/site-packages/django/db/models/base.py", line 550, in __init__
setattr(self, prop, kwargs[prop])
File "/Library/Python/2.7/site-packages/django/db/models/fields/related_descriptors.py", line 499, in __set__
manager = self.__get__(instance)
File "/Library/Python/2.7/site-packages/django/db/models/fields/related_descriptors.py", line 476, in __get__
return self.related_manager_cls(instance)
File "/Library/Python/2.7/site-packages/django/db/models/fields/related_descriptors.py", line 783, in __init__
(instance, self.source_field_name))
ValueError: "<Condition: epilepsy>" needs to have a value for field "condition" before this many-to-many relationship can be used.
[22/Feb/2017 20:01:45] "POST /conditions/new/condition/ HTTP/1.1" 500 15799

来自@snakefcz 的回答的追溯

内部服务器错误:/conditions/new/condition/ 回溯(最近一次通话最后): 文件“/Library/Python/2.7/site-packages/django/core/handlers/exception.py”,第 39 行,在内部 响应 = get_response(请求) _get_response 中的文件“/Library/Python/2.7/site-packages/django/core/handlers/base.py”,第 187 行 response = self.process_exception_by_middleware(e, request) _get_response 中的文件“/Library/Python/2.7/site-packages/django/core/handlers/base.py”,第 185 行 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件“/Library/Python/2.7/site-packages/django/views/decorators/csrf.py”,第 58 行,位于 Wrapped_view 返回 view_func(*args, **kwargs) 文件“/Library/Python/2.7/site-packages/django/views/generic/base.py”,第 68 行,在视图中 return self.dispatch(request, *args, **kwargs) 文件“/Library/Python/2.7/site-packages/rest_framework/views.py”,第 477 行,在调度中 响应 = self.handle_exception(exc) 文件“/Library/Python/2.7/site-packages/rest_framework/views.py”,第 437 行,在 handle_exception self.raise_uncaught_exception(exc) 文件“/Library/Python/2.7/site-packages/rest_framework/views.py”,第 474 行,在调度中 响应 = 处理程序(请求,*args,**kwargs) 处理程序中的文件“/Library/Python/2.7/site-packages/rest_framework/decorators.py”,第 52 行 返回函数(*args,**kwargs) 文件“/Users/user/medicalrecords/conditions/views.py”,第 45 行,在 create_condition 返回 response.Response(serializer.data, status=201) 数据中的文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 527 行 ret = super(Serializer, self).data 数据中的文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 262 行 self._data = self.to_representation(self.instance) to_representation 中的文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 496 行 ret[field.field_name] = field.to_representation(属性) to_representation 中的文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 643 行 self.child.to_representation(item) 用于可迭代项目 to_representation 中的文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 479 行 字段 = self._readable_fields get 中的文件“/Library/Python/2.7/site-packages/django/utils/functional.py”,第 35 行 res = instance.dict[self.name] = self.func(instance) 文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 373 行,在 _readable_fields self.fields.values() 中的字段字段 文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 359 行,在字段中 对于 self.get_fields().items() 中的键、值: 文件“/Library/Python/2.7/site-packages/rest_framework/serializers.py”,第 1010 行,在 get_fields 字段[field_name] = field_class(**field_kwargs) init 中的文件“/Library/Python/2.7/site-packages/rest_framework/fields.py”,第 733 行 super(CharField, self).init(**kwargs) TypeError: init() 得到了一个意外的关键字参数“view_name”

【问题讨论】:

  • 请您发布完整的回溯?
  • 添加了回溯
  • 您可能需要在模型上为 symptom 列添加 null=True。
  • 我应该把它放在哪里?在管理器中还是在序列化器中?
  • 在保存m2m字段数据之前必须先保存数据。

标签: django


【解决方案1】:

除了Condition 之外,您还需要创建一个Symptom 序列化程序。您的 ConditionSerializer 应该类似于:

class ConditionSerializer(serializers.ModelSerializer):
  symptoms = SymptomSerializer(read_only=True, many=True, allow_null=True)
  class Meta:
    model = Condition
    fields = ('id', 'treatment', 'name', 'contagious', 'treatable', 'treatment', 'severeity', 'symptoms', 'medicalfield')

  def create(self, validated_data):
    attrs = validated_data
    request = self.context['request']
    return Condition.new.create_condition(**attrs)

【讨论】:

  • 我刚刚进行了更改,但现在我遇到了经理的错误:
  • condition_obj = conditions.models.Condition(name=kwargs['name'],contagious=kwargs['contagious'],treatable=kwargs['treatable'],treatment=kwargs['treatment' ],severity=kwargs['severeity'],symbols=kwargs['symptoms'],medicalfield=kwargs['medicalfield']) KeyError: 'symptoms'
  • 我编辑了我的答案以显示@Manjit Kumar 所说的内容。听起来您在创建Condition 时传入了一个空的symptoms。您应该检查以确保您的 kwargs 具有密钥或在其上使用 .get() 方法来定义默认值。
【解决方案2】:
## Try it 
@api_view(['POST'])
    @permission_classes((AllowAny, ))
    def create_condition(request):
        context = {'request': request}
        serializer = ConditionSerializer(data=request.data, context=context)
        if serializer.is_valid():
           condition = serializer.save()
           symptoms = request.data['symptoms']
           for symp in symptoms:
               symptom = Symptom.objects.get(id=symp) ## if it's id's you are passing
               condition.symptoms.add(symptom)

           return response.Response(serializer.data, status=201)
    return response.Response(serializer.errors, status=400)

【讨论】:

  • 它成功地创建了对象,但它给了我一个 500 错误。我用回溯编辑了问题
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 2023-01-23
  • 2021-01-04
  • 2014-03-22
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多