TypeError: Python-Objekt ist nicht mit JSON serialisierbar

Ich versuche, ein Objekt mit @ in json zu kodierejson.dumps() In Django wird dieser Fehler jedoch ausgelöst, wenn ich ein Python-Objekt übergebe.

TypeError: <OrgInvite: OrgInvite object> is not JSON serializable

Ich ging davon aus, dass einer dieser Datentypen Objekte sind, obwohl JSON nur bestimmte Datentypen codieren kann. Ich habe eine andere Frage zu Stack Overflow gelesen, die ich am besten umgehen kann, indem ich mit @ ein Wörterbuch aus dem Objekt erstell.__dict__ Ich habe es versucht und es heißt, dass einer der Schlüssel in meinem neuen Wörterbuch _state nicht serialisierbar ist. Ich bin nicht sicher, woher dieser _state-Schlüssel stammt, und habe mich gefragt, ob es eine Möglichkeit gibt, mein Objekt ohne dieses zusätzliche Feld in ein Wörterbuch zu konvertieren, damit ich es in JSON codieren kan

Modell

class OrgInvite(models.Model):
    token = models.CharField(max_length=16, unique=True, null=False)
    account_id = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
    org_id = models.ForeignKey(Org, on_delete=models.CASCADE, null=False)
    used = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    name = models.CharField(max_length=70)
    email = models.CharField(max_length=255)

Aussicht

def get_invite(token):
    if not token:
        raise Exception("Invitation token is not specified")

    invitation = OrgInvite.objects.get(token=token)
    if not invitation:
        raise Exception("Invitation token is invalid.")

    return invitation

def invite_accept_redirect(token):
    # """ -Redirects to the accept invite frontend view with pre-fetched data. """

    try:
        invite = get_invite(token)
        if not invite:
            raise Exception("Invitation token is invalid")
        if invite.used:
            invite = {'used': True}
    except:
        invite = {'invalid': True}
        raise Exception("Resource not found.")

    base = "home/accept"

    url = '{}/{}?data={}'.format(base, token, urllib.quote_plus(json.dumps(invite.__dict__)))

    return redirect(url)

Konsole

>>> oi = OrgInvite.objects.get(token=100) 
>>> oi
<OrgInvite: OrgInvite object>
>>> oix = oi.__dict__
>>> oix
{'used': False, 'name': u'', '_state': <django.db.models.base.ModelState object at 0x10377a610>, 'email': u'', 'token': u'100', 'org_id_id': 101, 'account_id_id': 301, 'is_admin': False, 'id': 1}
>>> json.dumps(oix)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 244, in dumps
    return _default_encoder.encode(obj)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <django.db.models.base.ModelState object at 0x10377a610> is not JSON serializable

Antworten auf die Frage(6)

Ihre Antwort auf die Frage