2017-07-17 14 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 

ItemItemOwnerを作成するための引数として渡された値を使用して作成する必要があります。私はモデルがmodelname.save("parameters")で作成できることを知っています。しかし、ここではパラメータはリクエストからアクセスされ、私はViewSetを使ってリクエストインスタンスをどこから取るべきかわからない。私が正確に探しているのは、ItemOwnerが作成されたときにのみ呼び出されるメソッドです。このメソッドはrequestインスタンスを持ち、引数を取得してItemモデルを作成できます。どうすればいいですか?

+1

'ItemOwnerViewSet'クエリセット内のそのタイプミスですか? ItemOwnerを作成した後にリクエストにアクセスしたいのはなぜですか? Itemには '' name''というフィールドが1つしかなく、私が間違っていれば正しいものになります。owner_nameはItem.nameと同じですか?だから、ItemOwnerのpost_signalを作成し、 'Item'を作成できますか? –

+0

owner_nameは項目名ではありません。どちらも違います。私はdjangoを初めて使っており、post_signalとすべての仕組みが正確にわからない。 plzは私にコード –

+0

のタイプミスをクリアしました。 –

答えて

0

post_signalItemOwnerモデルを追加できます。そして、オブジェクトを作成した後、簡単に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

あなたのリクエストに余分なフィールドを追加した方法を教えてください。あなたの完全なシリアライザが、リクエストボディのキー値フィールドとして –

関連する問題