2012-11-28 8 views
7

Supponiamo che io ho questo modello:Django get_or_create, come dire commettere = 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) 

Se lo faccio:

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 

Non voglio includere added_by campo in criteri di filtro. Voglio salvare il campo added_by in seguito. Qualcosa di simile commit=False dire Django che ho intenzione di aggiungere più campi tardi:

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 

So che ci sono alternative per esempio Posso usare ObjectDoesNotExist. Ma esiste un modo per ottenere la funzionalità desiderata in get_or_create?

Il motivo per cui voglio escludere il campo added_by è perché potrebbe essere un altro utente ha già aggiunto un altro profilo utente.

+2

Aggiunta impegnano = False per get_or_create è una buona idea. Forse ti piacerebbe fluttuare il suggerimento sulla mailing list di django-developers. – s29

risposta

9

C'è un argomento defaults è possibile passare a get_or_create per popolare questi dati per gli oggetti appena creati non utilizzati nel filtraggio:

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

Problemi correlati