用Django中的信号省略OneToOne字段的序列化?

时间:2015-12-15 18:25:11

标签: python json django serialization

我正在尝试序列化具有存储特定用户配置文件的OneToOneField的模型。由于该用户配置文件用于检索该模型的用户实例,因此我无法将其从模型中删除,但我认为当我尝试序列化并发送JSON数据时,这会导致我的问题。我不确定我是否解释得那么好,因为我对Django很新,但希望以后会更清楚。

这个模型基本上是这样的:

class ModelName(models.Model):
    profile = models.OneToOneField(Profile)
    other_field = models.BooleanField(default = True)
    etc_field = models.CharField()
    ...

以下是我的序列化程序的样子:

class ModelNameSerializer(serializers.ModelSerializer):
    class Meta:
        model = ModelName
        fields = ('other_field', 'etc_field', ...)

当我调用串行器时,我会在发送post_save信号后这样做。也就是说,我有一个接收器,它使用新保存的模型实例将模型的数据序列化为JSON。这是看起来像:

@receiver(post_save, sender=ModelNameForm, dispatch_uid='uniquestring')
def arc_update(sender, instance, **kwargs):
    serializer = ModelNameSerializer(instance)
    print(serializer.data)

当然,控制台中的print语句用于调试,以便我可以测试信号是否正在发送,接收和执行。但是,它打印出来:

{'other_field': data, 'etc_field': data, ...}
{}

我知道空数据集正在尝试打印配置文件数据,因为当我保留配置文件字段时,它打印了这个:

{'profile': 1, 'other_field': data, 'etc_field': data, ...}
{'profile': 1}

但我不知道如何摆脱额外的个人资料打印。起初我以为它被多次调用,这是dispatch_uid被添加的内容,但这并没有解决任何问题。如何摆脱配置文件的额外序列化?

谢谢!

更新:

发送到接收方的ModelName实例在views.py中调用,其中用户填写的表单包含other_fieldetc_field,依此类推。这是看起来像:

@login_required
def modelname(request):
    user = get_object_or_404(User, username=request.user)
    profile, created = Profile.objects.get_or_create(user=user)
    modelname, created = ModelName.objects.get_or_create(profile=profile)
    context = {}
    form = ModelNameForm(request.POST or None, instance=modelname)
    context.update({"form": form})
    if request.method == 'POST':
        if form.is_valid():
            form.save()    #This is sending the post_save signal
            ...
    return render(request, ...)

另外,根据要求,这是表单代码!

class ModelNameForm(forms.ModelForm):
    class Meta:
        model = ModelName
        fields = ['other_field', 'etc_field', ...]

0 个答案:

没有答案