2012-11-28 8 views
7

Angenommen, ich habe dieses Modell:Django get_or_create, wie zu begehen sagen = False

class SocialGroupMembers(models.Model): 
    social_group = models.ForeignKey(SocialGroup, related_name="members") 
    profile = models.ForeignKey(Profile) 
    date_joined = models.DateTimeField(auto_now_add=True) 
    added_by = models.ForeignKey(User) 
    approved = models.BooleanField(default=False) 

Wenn ich tun:

obj, created = SocialGroupMembers.objects.get_or_create(
     social_group=social_group, profile=profile) 
    # this will give integrity error that added_by can not be null 

Ich will nicht added_by Feld in Filterkriterien aufzunehmen. Ich möchte später das Feld added_by speichern. So etwas wie commit=False Django zu sagen, dass ich Pläne, um weitere Felder hinzufügen später:

obj, created = SocialGroupMembers.objects.get_or_create(commit=False, 
     social_group=social_group, profile=profile) 
if created: 
    obj.added_by = request.user 
    obj.save() 
else: 
    #do something 

Ich weiß, es gibt Alternativen z.B. Ich kann ObjectDoesNotExist verwenden. Aber gibt es eine Möglichkeit, die gewünschte Funktionalität in get_or_create zu erreichen?

Der Grund, warum ich das Feld added_by ausschließen möchte, ist, weil möglicherweise ein anderer Benutzer bereits ein anderes Benutzerprofil hinzugefügt hat.

+2

zu begehen Hinzufügen = False gut ist get_or_create Idee. Vielleicht möchten Sie den Vorschlag auf der Mailingliste django-developers veröffentlichen. – s29

Antwort

9

Es gibt ein defaults Argument Sie get_or_create passieren können für neu erstellte Objekte diese Daten zu füllen, die bei der Filterung nicht verwendet werden:

defaults = {'added_by': request.user} 
obj, created = SocialGroupMembers.objects.get_or_create(
     social_group=social_group, profile=profile, defaults=defaults) 

https://docs.djangoproject.com/en/1.4/ref/models/querysets/#get-or-create

Verwandte Themen