Olyan modellt próbálok szerializálni, amelynek van egy OneToOneFieldje, amely egy adott felhasználói profilt tárol. Mivel ezt a felhasználói profilt használják a modell felhasználói példányának lekérésére, nem tudom eltávolítani a modellből, de úgy gondolom, hogy ez okozza a problémáimat, amikor JSON-adatokat próbálok szerializálni és elküldeni. Nem vagyok benne biztos, hogy jól elmagyaráztam-e, mivel még nagyon új vagyok a Django-ban, de remélhetőleg később világosabb lesz.
A modell alapvetően így néz ki:
class ModelName(models.Model):
profile = models.OneToOneField(Profile)
other_field = models.BooleanField(default = True)
etc_field = models.CharField()
...
Így néz ki a sorozatkészítőm:
class ModelNameSerializer(serializers.ModelSerializer):
class Meta:
model = ModelName
fields = ('other_field', 'etc_field', ...)
Amikor hívom a sorosítót, azt a post_save jel elküldése után teszem. Ez azt jelenti, hogy van egy vevőm, amely az újonnan mentett modellpéldányt használja a modell adatainak JSON-ba sorosítására. Így néz ki:
@receiver(post_save, sender=ModelNameForm, dispatch_uid='uniquestring')
def arc_update(sender, instance, **kwargs):
serializer = ModelNameSerializer(instance)
print(serializer.data)
Természetesen a konzolban található print utasítás a hibakeresésre szolgál, hogy le tudjam tesztelni a jel küldését, fogadását és végrehajtását. Viszont ezt írja ki:
{'other_field': data, 'etc_field': data, ...}
{}
Tudom, hogy az üres adatkészlet megpróbálja kinyomtatni a profiladatokat, mert amikor a profilmezőt bent tartottam, ezt nyomtatta:
{'profile': 1, 'other_field': data, 'etc_field': data, ...}
{'profile': 1}
De nem tudom, hogyan lehet megszabadulni ettől az extra profilnyomattól. Először azt hittem, hogy többször hívják, erre adták hozzá a dispatch_uid
-t, de ez nem javított semmit. Hogyan lehet megszabadulni a profil extra szerializálásától?
Kösz!
FRISSÍTÉS:
A fogadónak küldött ModelName
példányt a views.py
hívja meg, ahol a felhasználó kitölt egy űrlapot, amely tartalmazza a other_field
és etc_field
és így tovább és így tovább. Ez így néz ki:
@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, ...)
Illetve kérésre itt az űrlap kódja is!
class ModelNameForm(forms.ModelForm):
class Meta:
model = ModelName
fields = ['other_field', 'etc_field', ...]