WebHU - Programozási kérdések és válaszok

Kihagyja a OneToOne mező szerializálását jelekkel a Django-ban?

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', ...]

  • stackoverflow.com/questions/27935558/ 15.12.2015
  • @ShangWang A probléma nem az, hogy nem tudok kizárni bizonyos mezőket, azt hiszem, mivel a profilmezőt ki tudtam hagyni a szerializálásból. A probléma az, hogy még mindig megpróbál szerializálni valamit a Profile modellből, valószínűleg azért, mert a ModelName-hez van csatolva, így megpróbálja szerializálni a Profile-ot. 15.12.2015
  • Tehát van post_save vevője ModelNameForm számára? Alapvetően egy Form példányt adsz át a Serializer-nek? Meg tudod ezt ellenőrizni? Látod, hogy a szerializálód érvényes-e? Nyomtatás serializer.is_valid(). 15.12.2015
  • @RohitJain Ha megpróbálom meghívni a serializer.is_valid() függvényt, hibaüzenetet kapok, amely szerint a .is_valid() nem hívható meg, mivel a serializer példány példányosítása során nem adtak át data= kulcsszó argumentumot. Ez azonban akkor is előfordul, ha sender=ModelNameForm helyett sender=ModelName-ra módosítom. Azért változtattam ModelNameForm-re, mert ha megteszem a sender=ModelName-t, akkor kétszer nyomtatja ki az adatokat, és azt sem tudom, miért történik ez, mivel benne van a dispatch_uid... 15.12.2015
  • @aevumcessi Meg tudod mutatni, hogyan és hol hozol létre ModelName példányt? 15.12.2015
  • @RohitJain Most frissítette a bejegyzést! 15.12.2015
  • Ok, tehát ha a jel ModelName-en van, akkor kétszer hívják. Egyszer get_or_create(profile=profile), egy másik pedig form.save(). Éppen ezért, amikor először nem volt other_fields és etc_field, és az űrlap mentése után megkaptad őket. A get_or_create helyett megteheti a következőt: ModelName(profile=profile), ha a példány nem létezik ezzel a profile-val. Így csak a következő napon jön létre: form.save() 15.12.2015
  • @RohitJain Ha megteszem a ModelName(profile=profile) műveletet, akkor hibaüzenetet kapok, amely szerint 'ModelName' object is not iterable? 15.12.2015
  • Honnan veszed ezt a hibát? 15.12.2015
  • @RohitJain Ezt a hibát kapom, miután megpróbáltam frissíteni az űrlapot, közvetlenül azután, hogy megpróbálta a POST-ot 15.12.2015
  • @aevumcessi Iterálsz a ModelName kötött objektumon a sablonban a GET kérésben? Ez a sor nem ad ilyen hibát. 15.12.2015
  • @RohitJain Nem vagyok benne biztos, hogy ez pontosan mit jelent (új a Django számára), de azt hiszem, azt kérdezed, hogy átmegy-e a ModelName-nek szükséges mezőkön, igaz? Ebben az esetben igen, mivel le kell kérnie a ModelNameForm-ot a ModelName összes mezőjével, hogy létrehozza vagy frissítse a ModelName példányt az adott felhasználó számára. 15.12.2015
  • @aevumcessi Nem, úgy értem, ModelName példányt iterálsz a html template fájlodban, ahol ez az űrlap elő van állítva? El tudod küldeni a sablonfájlt? 15.12.2015
  • Hogyan néz ki az űrlap kódja? Ezenkívül miért ne használja a szerializálót az adatok mentésére, nem pedig egy űrlapot? 15.12.2015
  • @RohitJain pastebin.com/0zHKJGhX Ez a sablonfájl! 15.12.2015
  • @JoeyWilhelm Használhatja a sorosítót olyan oldalak adatainak mentésére, amelyek egy űrlap frissítését vagy kitöltését kérik a felhasználótól? Néhány másodpercen belül frissítem a bejegyzést az űrlapkóddal. 15.12.2015
  • @aevumcessi Valami rossz itt. A ModelForm és a megjelenített sablon nem okozhat hibát. Biztos vagy benne, hogy nem hagysz ki itt semmi fontosat? Mire valók ezek a ... a mezők listájában? 15.12.2015
  • @aevumcessi Megpróbálhatod áthelyezni a ModelName és Profile objektum létrehozását a if request.method == 'POST' blokkon belül? Úgy értem, GET kéréshez nem kell instance argumentumot átadnia a form-nak. Csak adja hozzá a ModelNameForm()-et a kontextushoz. Nézze meg, hogy ez a változtatás megoldja-e a dolgokat. 15.12.2015
  • @RohitJain De nincs szüksége a példányra az űrlap egy korábban mentett változatának kitöltéséhez? Így a GET kérésben az oldal betöltésekor a felhasználónak nem kell mindent kitöltenie, amit már kitöltött. Ezenkívül a mezőlistában szereplő ... csak a modell egyéb mezőire vonatkozik, amelyeket ki kell tölteni. 22.12.2015

Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..