Django - UserProfile property speichern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Ahsous
User
Beiträge: 5
Registriert: Samstag 22. Januar 2011, 21:36

Hallo,

ich habe folgenden Codeschnipsel gefunden, welcher bei mir allerdings nicht wirklich richtig klappt:

Code: Alles auswählen

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True)
    some_field = models.CharField(max_length = 100, default = 'Test')

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
In den Einstellungen habe ich natürlich

Code: Alles auswählen

AUTH_PROFILE_MODULE = 'meinapp.UserProfile'
hinzugefügt.

In einer View probiere ich dann folgendes:

Code: Alles auswählen

    print(request.user.profile == request.user.get_profile())
    print(request.user.profile.some_field, request.user.get_profile().some_field)
    request.user.profile.some_field = '1'
    print(request.user.profile.some_field, request.user.get_profile().some_field)
    request.user.get_profile().some_field = '1'
    print(request.user.profile.some_field, request.user.get_profile().some_field)
Geändert wird some_field nur wenn ichs über get_profile() mache.
Über meine Property funkioniert es nicht (Egal ob das UserProfil in der Datenbank schon vorhanden ist oder nicht).

Hat jemand 'ne Idee wieso das ganze übers Property nicht funktioniert?

mfg Ahsous
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

User.profile wird natürlich bei jedem Zugriff evaluiert und somit immer neu aus der Datenbank geladen, insofern ist die property dort ziemlich schwachsinnig…
Ahsous
User
Beiträge: 5
Registriert: Samstag 22. Januar 2011, 21:36

Hmm, daran hab ich natürlich garnicht gedacht.

Gibt es sonst eine Möglichkeit mein Vorhaben (Zugriff aufs Userprofil ohne es vorher "manuell" hinzufügen zu müssen [Also eben genau das, was ich von dieser Property erwartet hab]) zu realisieren?

EDIT: Nen bisschen überlegen ist immer gut:

Code: Alles auswählen

def profile_get(user):
    try:
        return user.get_profile()
    except UserProfile.DoesNotExist:
        # Create new profile.
        profile = UserProfile.objects.create(user = user)
        profile.save()
        return profile_get(user)
    
User.profile = property(lambda u: profile_get(u))
funktioniert so wie gewollt.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Yikes, ist aber auch nicht grad effizient :þ Schau doch mal was get_profile() von Django macht, das tut genau das was willst (also was die Persistenz der Daten betrifft -- create musst dann halt selber dazutun)
Antworten