2017-02-18 10 views
0

пытается создать некоторое вложенное создание модели с помощью drf/create serizlizer.DRF oneToOneField Создать сериализатор

То, что я пытаюсь сериализовать, - это модель «TradePost», в которой есть почта, и ProductItem.

У меня уже есть «ProductItemSerializer» и «PostSerializer», используя это .. как я могу сериализовать их ?? с созданием? не сообщая существующей записи с значением pk.

models.py

class ProductItem(models.Model): 
    baseProduct = models.ForeignKey(Product, related_name='baseProduct') 

    seller = models.ForeignKey(User) 

    price = models.DecimalField(max_digits=6, decimal_places=2) 

    isOrderClosed = models.BooleanField() 
    isTradeCompleted = models.BooleanField() 


    def __str__(self): 
     return '[seller = '+self.seller.username+']' + '[product = '+(str)(self.baseProduct)+']' + '[id = '+(str)(self.id)+']' 




class TradePost(models.Model): 

    basePost = models.OneToOneField(Post) 

    baseProductItem = models.OneToOneField(ProductItem) 

    def __str__(self): 
     return '[post = ' + (str)(self.basePost) + ']' + '[product = ' + (str)(self.baseProductItem) + ']' + '[id = ' + (str)(self.id) + ']' 

в serialziers.py

class ProductItemCreateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ProductItem 
     fields = ('baseProduct', 'price') 



#??? 
class TradePostCreateSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = TradePost 
     fields = ('basePost', 'baseProductItem',) 

    def create(self, validated_data): 
     post = 

ответ

0

Вы можете использовать сериализаторы представлять поле, например, для,

class TradePostCreateSerializer(serializers.ModelSerializer): 
    basePost = PostSerializer() 
    baseProductItem = ProductItemSerializer() 

    class Meta: 
     model = TradePost 
     fields = ('basePost', 'baseProductItem',) 

Ссылка:

DRF Nested relationships

Если вы ищете перезаписываемые вложенных сериализаторы

Writable nested serializers

+0

Я имею в виду таким образом, ему нужно значение pk, которое уже создало запись. или? я не понимаю понимания? – uzu

+0

Получение этого { "basePost": [ "Неверный тип. Ожидаемое значение pk, полученный dict." ], "baseProductItem": [ "Неверный тип. Ожидаемое значение pk, полученный dict." ] } – uzu

0

Подобно writable nested serializer, вы можете попробовать что-то вроде этого:

class TradePostCreateSerializer(serializers.ModelSerializer): 
    basePost = PostCreateSerializer() 
    baseProductItem = ProductItemCreateSerializer() 

    class Meta: 
     model = TradePost 
     fields = ('basePost', 'baseProductItem',) 

    def create(self, validated_data): 
     # pop out the dict to create post and item, depend on whether you want to create post or not 
     post = validated_data.get('basePost') 
     product = validated_data.get('baseProductItem') 
     # create post first 
     trade_post = None 
     post_obj = Post.objects.create(**post) 
     if post_obj: 
      # create product item 
      prod_item = ProductItem.objects.create(basePost=post_obj, **product) 
      trade_post = TradePost.objects.create(baseProduct=prod_item, **validated_data) 
     return trade_post 

Для питона, пожалуйста, следуйте именование и используйте lower_case_with_underscores, как base_product, base_post, будет намного легче читать

 Смежные вопросы

  • Нет связанных вопросов^_^