2017-02-22 11 views
0

У меня есть модель Condition, у которой есть поле symptoms, которое занимает несколько разных объектов Symptoms. Всякий раз, когда я делаю запрос POST для создания объекта Condition, я получаю следующее сообщение об ошибке:Вопрос с доставкой Django POST с моделью

'Condition: epilepsy' needs to have a value for field "condition" before this many-to-many relationship can be used.

выше «Условие: эпилепсии» вложен между <>, но Theres проблемы с форматированием с размещением этого.

Вот моя модель Состояние:

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) 

Вот мой Serializer

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 «ы ответ

Internal Server Error: /conditions/new/condition/ Traceback (most recent call last): 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 45, in create_condition return response.Response(serializer.data, status=201) File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 527, in data ret = super(Serializer, self).data File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 262, in data self._data = self.to_representation(self.instance) File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 496, in to_representation ret[field.field_name] = field.to_representation(attribute) File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 643, in to_representation self.child.to_representation(item) for item in iterable File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 479, in to_representation fields = self._readable_fields File "/Library/Python/2.7/site-packages/django/utils/functional.py", line 35, in get res = instance.dict[self.name] = self.func(instance) File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 373, in _readable_fields field for field in self.fields.values() File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 359, in fields for key, value in self.get_fields().items(): File "/Library/Python/2.7/site-packages/rest_framework/serializers.py", line 1010, in get_fields fields[field_name] = field_class(**field_kwargs) File "/Library/Python/2.7/site-packages/rest_framework/fields.py", line 733, in init super(CharField, self).init(**kwargs) TypeError: init() got an unexpected keyword argument 'view_name'

+0

Вас проводке полный отслеживающий, пожалуйста? – themanatuf

+0

добавил трассировку – PCR

+0

, вам может понадобиться добавить null = True для столбца 'symmom' на вашей модели. –

ответ

0

Вам нужно будет создать Symptom сериалайзер в дополнение к Condition один. Ваш 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) 
+0

Я только что внес изменения, но теперь я получаю сообщение об ошибке с менеджером: – PCR

+0

condition_obj = условия.models.Condition (name = kwargs ['name'], contagious = kwargs ['contagious'], treatable = kwargs [ «treatable»], лечение = kwargs ['treatment'], суровость = kwargs ['суровости'], симптомы = kwargs ['symptoms'], medicalfield = kwargs ['medicalfield']) KeyError: 'симптомы' – PCR

+0

Я отредактировал мой ответ, чтобы показать, что сказал @Manjit Kumar. Похоже, что вы передаете пустые «симптомы», когда создаете «Условие». Вы должны проверить, чтобы ваш 'kwargs' имел ключ или использовал метод' .get() 'для определения значения по умолчанию. – themanatuf

0
## 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) 
+0

Это успешно создает объект, но он дает мне ошибку 500. Я редактировал вопрос с трассировкой – PCR