繁体   English   中英

如何在基于父模型的另一个模型中创建对象?

How can I create an object in another model based off parent model?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在尝试实现(并真正映射出)基于父模型的新模型对象时遇到了麻烦。

下面的Bucket模型有一个基于两个category_optionscategory字段。

class Bucket(models.Model):

    category_options = (
        ('personal', 'Personal'),
        ('social', 'Social'),
    )


    class BucketObjects(models.Manager):
        def get_queryset(self):
            return super().get_queryset()

    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='buckets')
    admin_user = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='admin_user')
    guest_user = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='guest_user', blank=True)
    category = models.CharField(max_length=30, choices=category_options)

    ...

    objects = models.Manager()
    bucketobjects = BucketObjects()

    class Meta:
        ordering = ('-created',)

    def save(self, *args, **kwargs):
        if self.stock_list:
            self.stock_count = len(self.stock_list)
            super().save(*args, **kwargs)
        else:
            super().save(*args, **kwargs)

我想在完全不同的模型SocialBucket创建一个新对象,当Bucket模型实例根据上面的category字段被选为social类别时:

class SocialBucket(models.Model):
    bucket = models.ForeignKey(Bucket.objects.id, on_delete=models.CASCADE, related_name='social_buckets)

我怎样才能根据它的父级Bucket模型用新对象填充我的SocialBucket模型?

编辑:根据要求,这是我将使用的视图:

view.py

class CreateBucket(generics.CreateAPIView):
    permission_classes = [IsAuthenticated]
    serializer_class = BucketCreateSerializer
    queryset = Bucket.objects.all()

serializer.py

class BucketCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bucket
        fields = ('owner','category','name','about')
        read_only_fields = ['owner']
    
    def create(self, validated_data):
        user = self.context['request'].user
        bucket = Bucket.objects.create(
         owner=user, 
         **validated_data
        )
        bucket.save()
        return bucket
3 个回复

尝试将 models.Model 更改为 Bucket:

class SocialBucket(Bucket)
    bucket = models.ForeignKey(Bucket.objects.id, on_delete=models.CASCADE, related_name='social_buckets)

我认为最好的方法是使用post_save信号,例如:

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


class Bucket(models.Model):
    ....

class SocialBucket(models.Model):
     bucket = models.ForeignKey(Bucket, on_delete=models.CASCADE, related_name='social_buckets')

@receiver(post_save, sender=Bucket)
def create_social_bucket(sender, instance, created, **kwargs):
    if created and instance.category == 'social':
        SocialBucket.objects.create(bucket=instance)

此外,还有另一种实现方式 它是覆盖 Bucket 模型中的 save 方法:

class SocialBucket(models.Model):
    bucket = models.ForeignKey('Bucket', on_delete=models.CASCADE, related_name='social_buckets')  # putting the class of model as a string value to avoid import error

class Bucket(models.Model):
    ....

    def create_social_bucket(self, create_social_bucket=False):
       if create_social_bucket:
           Social.objects.create(bucket_id=self.id)

   def save(self, *args, **kwargs):
       if self.stock_list:
           self.stock_count = len(self.stock_list)
       create_social_bucket = False
       if self.pk is None and self.category == 'social':
           create_social_bucket = True
       super().save(*args, **kwargs)
       self.create_social_bucket(create_social_bucket)

虽然不建议这样做。 你可以破解和硬编码:

class BucketCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Bucket
        fields = ('owner','category','name','about')
        read_only_fields = ['owner']
    
    def create(self, validated_data):
        user = self.context['request'].user
        bucket = Bucket.objects.create(
         owner=user, 
         **validated_data
        )
        bucket.save()
        # creating SocialBucket if category is social. You can later update it.
        if bucket.category == 'social':
            social_bucket = SocialBucket()
            social_bucket.bucket = bucket
            social_bucket.save()
        return bucket
1 更新某个模型时如何在另一个模型中获取或创建对象?

我有一个 select2 选项可以在我的表单中选择记者。 用户在新闻创建表单中随机放置记者姓名,并在保存表单的同时创建记者对象并在新闻记者(多对多)字段中分配这些对象。 这在创建对象时工作正常 更新时出现了一些问题。在更新表单中会有已经分配在新闻中的记者。用户可以添加记者,也可以从表单中删除记者。 ...

4 如何创建对象并将其另存为另一个模型中的新实例

我的模型B将模型A称为PK。 在这个问题我正在创建一个模型A.在我的表单清理方法中,我做了下面的代码。 我收到一个错误:“save()禁止使用未保存的相关对象'transac'来防止数据丢失。” 我明白这可能是因为我正在保存2个transac实例。 1来自表单本身,另一个来自于cle ...

6 在Piston Django的一个处理程序中从不同模型创建对象

我正在使用Piston为Django中的应用程序创建API。 我将尝试以一种简单的方式来解释我的疑问。 假设我有两个模型: 现在,如果我收到这样的网址: 我想在数据库中添加一个人,为此,我需要在数据库中添加一个新设备,但是,由于活塞中的处理程序已链接到模型,因此如何在同一 ...

7 如何在 TypeScript/NodeJs 的模型中动态创建对象?

我有一个模型,它有一个静态属性,我希望根据输入生成其他属性。 我正在使用npm flat来展平 JSON。 在这里,我可以看到我的对象正在变平,但我没有得到我想要的输出。 我试过[key: string]: any , Record<string, unknown>和[]但看起来我在这 ...

8 使用模型在组件中创建对象

我在Ember 3.4 我可以用创建一个EmberObject 但是我已经有一个课程模型,在'app/models/course.js' 。 我想知道是否可以“导入”组件中的模型并使用它来创建对象。 ...

9 如何在 Django 中创建一个模型的对象,同时创建另一个不同的模型?

这听起来很令人困惑,但我会将我的代码放在这里以便更好地理解我的问题。 每次创建Model Client的对象时,我都想创建一个Model Product的新对象。 我试图覆盖保存方法,但没有用。 编辑:覆盖 save 方法的主要问题是 Product 对象是在编辑客户端对象之后创建的,而不是在创 ...

10 一个函数接受不同的模型并根据Django中的模型动态创建对象

我想创建一个像 因为我不想一次又一次地创建对象并将它们保存在数据库中。您在函数中传递模型名称,并根据传递的** kwargs创建对象。 我如何导入路径运行时以及函数的主体。 * 而且最主要的是我不知道导入哪个模型以及从哪个模型导入。在运行时,所有事物都对我可见,因此如何在函数中导 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM