2017-07-17 166 views
-3

有一个Django模型Item和一个AbstarctUser itemOwner。创建itemOwner后,我需要创建相应的item。的ItemItemOwner的意见和模型,如下图所示:Django:创建用户模型

class ItemOwner(AbstractUser): 
    owner_name = models.CharField(max_length=64, null=True, blank=True) 
    item = models.ForeignKey(Item, related_name='owner',null=True) 

class ItemOwnerViewSet(viewsets.ModelViewSet): 
    queryset = ItemOwner.objects.all() 
    serializer_class = ItemOwnerSerializer 

class Item(models.Model): 
    name = models.CharField(max_length=64, verbose_name='name') 

class ItemViewSet(viewsets.ModelViewSet): 
    queryset = Item.objects.all() 
    serializer_class = ItemSerializer 

Item需要与已作为参数传递了用于创建ItemOwner值来创建。我知道可以用modelname.save("parameters")创建一个模型。但是这里的参数是从请求中访问的,我不知道从哪里开始使用ViewSet实现请求实例。我正在寻找的是仅在创建ItemOwner时才会调用的方法,并且此方法应该有一个request实例来检索参数,以便我可以使用它创建Item模型。我该怎么做?

+1

的是,在'ItemOwnerViewSet'查询集一个错字?为什么您想在ItemOwner创建后访问请求?我猜项目只有一个字段是“'名称”,纠正我,如果我错了owner_name等于Item.name权利?所以你可以为ItemOwner创建一个post_signal并创建'Item'? –

+0

owner_name不是项目名称。两者都不同。而且我对django很陌生,并且不清楚post_signal和所有的作品。 plz让我看看代码 –

+0

错字现在被清除。 –

回答

0

您可以将post_signal添加到ItemOwner型号。创建对象后,您可以轻松创建Item对象。

models.py

from django.db.models.signals import post_save 
from django.dispatch import receiver 

--- Your Models here --- 

# method for updating 
@receiver(post_save, sender=ItemOwner) 
def create_item(sender, instance, **kwargs): 
    item_obj = Item.objects.get_or_create(name=instance.owner_name) 
    instance.item = item_obj 
    instance.save() 

更新:

class ItemOwnerViewSet(viewsets.ModelViewSet): 
    queryset = ItemOwner.objects.all() 
    serializer_class = ItemOwnerSerializer 

    def perform_create(self, serializer): 
     serializer.save(item=Item.objects.get_or_create(name=self.request.data.get('name')) 
+0

name = instance.owner_name ,.这是错误的。 name是将在请求中传递的另一个字段。 –

+0

是的,我没有你的请求清晰的图片。请详细说明你的问题。在这种情况下,这个信号是无效的。 –

+0

告诉您如何在请求中添加额外字段。可能会显示您的完整序列化程序将帮助 –