我正在尝试序列化具有存储特定用户配置文件的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_field
和etc_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', ...]