Seite 1 von 1

Django - UserProfile property speichern

Verfasst: Samstag 17. März 2012, 20:01
von Ahsous
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

Re: Django - UserProfile property speichern

Verfasst: Samstag 17. März 2012, 20:17
von apollo13
User.profile wird natürlich bei jedem Zugriff evaluiert und somit immer neu aus der Datenbank geladen, insofern ist die property dort ziemlich schwachsinnig…

Re: Django - UserProfile property speichern

Verfasst: Samstag 17. März 2012, 20:29
von Ahsous
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.

Re: Django - UserProfile property speichern

Verfasst: Sonntag 18. März 2012, 09:51
von apollo13
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)