【问题标题】:Django : Create a model on creating a userDjango:在创建用户时创建模型
【发布时间】:2017-12-21 15:00:42
【问题描述】:

有一个 Django 模型 Item 和一个 AbstarctUser itemOwner。创建itemOwner 后,我需要创建其对应的itemItemItemOwner的视图和模型如下图:

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 模型。我该怎么做?

【问题讨论】:

  • 这是ItemOwnerViewSet 查询集中的错字吗?为什么要在 ItemOwner 创建后访问请求?我猜 Item 只有一个字段,即 `name,如果我错了,请纠正我 owner_name 等于 Item.name 对吗?所以你可以为 ItemOwner 创建一个 post_signal 并创建 Item ?
  • owner_name 不是项目名称。两者都是不同的。我是 django 的新手,不知道 post_signal 和 all 是如何工作的。请给我看代码
  • 错字已清除。

标签: django django-models django-views django-rest-framework


【解决方案1】:

您可以将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'))

【讨论】:

  • name=instance.owner_name,。这是错误的。 name 是另一个将在请求中传递的字段。
  • 是的,不过我没有清楚地了解您的要求。请详细说明您的问题。在那种情况下,这个信号是无效的。
  • 告诉您如何在请求中添加该额外字段。可能会显示您的完整序列化程序会有所帮助
  • 作为请求正文中的键值字段
  • @HariKrishnan 我更新了答案,但我不知道这会奏效。试着告诉我
猜你喜欢
  • 2021-06-19
  • 2019-10-17
  • 2019-01-12
  • 2015-05-20
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2012-07-14
  • 2018-12-29
相关资源
最近更新 更多