1

I try add order with product by overriding .create() method:

class OrderCreateSerializer(ModelSerializer):
    product = PrimaryKeyRelatedField(queryset=Product.objects.all())

    class Meta:
        model = Order
        fields = [
            'owner',
            'product'
        ]

    def create(self, validated_data):
        product = validated_data.pop('product')
        order = Order.objects.create(**validated_data)
        order.product_set.add(product)
        return order

But got this error:

Got AttributeError when attempting to get a value for field product on serializer OrderCreateSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Order instance. Original exception text was: 'Order' object has no attribute 'product'.

Traceback:

Traceback (most recent call last):
    File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/denis/Projects/lunch_order/.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 "/home/denis/Projects/lunch_order/.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 "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/views.py", line 483, in dispatch
    response = self.handle_exception(exc)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/views.py", line 443, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/views.py", line 480, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/generics.py", line 192, in post
    return self.create(request, *args, **kwargs)
  File "/home/denis/Projects/lunch_order/apps/api/views.py", line 24, 
in create
    headers = self.get_success_headers(serializer.data)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/serializers.py", line 560, in data
    ret = super(Serializer, self).data
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/serializers.py", line 262, in data
    self._data = self.to_representation(self.instance)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/serializers.py", line 514, in 
to_representation
    attribute = field.get_attribute(instance)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/relations.py", line 177, in get_attribute
    return super(RelatedField, self).get_attribute(instance)
  File "/home/denis/Projects/lunch_order/.venv/lib/python3.5/site- 
packages/rest_framework/fields.py", line 462, in get_attribute
     raise type(exc)(msg)
AttributeError: Got AttributeError when attempting to get a value for 
field `product` on serializer `OrderCreateSerializer`.
The serializer field might be named incorrectly and not match any 
attribute or key on the `Order` instance.
Original exception text was: 'Order' object has no attribute 
'product'.

But, order and product are created

Views:

class OrderCreateAPIView(CreateAPIView):
    model = Order
    serializer_class = OrderCreateSerializer

Models:

class Order(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)

class Product(models.Model):
    order = models.ManyToManyField(Order, blank=True)
    title = models.CharField(max_length=120)
    manufacturer = models.CharField(max_length=120)
    price = models.IntegerField()  

EDIT Got that error after changing code:

TypeError: 
<django.db.models.fields.related_descriptors.
create_forward_many_to_many_manager.<locals>.ManyRelatedManager object 
at 0x7fe9981e0b70> is not JSON serializable

1 Answer 1

3

By default reverse related name for manytomany field is model_set so use source=product_set argument for product field. Also since product_set contain many objects use many=True for this field:

class OrderCreateSerializer(ModelSerializer):
    product = PrimaryKeyRelatedField(source='product_set', many=True, queryset=Product.objects.all())
Sign up to request clarification or add additional context in comments.

4 Comments

@DenisSvistunov also can you show how do you post product? Is it like this: {"product": [1,2]}?
I need to add only one product and data looks like this { "owner": 1, "product": 1 }
@DenisSvistunov manytomany field implies list of objects. If you need to add only one object use {"product": [1]}
@ neverwalkaloner, thank you, I am understood, I added many=True and changed my request to {"product": [1]} and changed order.product_set.add(product[0]). all work without errors. Thank you for help

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.