2012-11-28 19 views
7

Załóżmy, że mam tego modelu:Django get_or_create, jak powiedzieć popełnić = 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) 

Jeśli zrobić:

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 

Nie chcę aby to added_by pola w kryteriach filtrowania. Chcę później zapisać pole added_by. Coś jak commit=False Django powiedzieć, że mam plany, aby dodać więcej pól później:

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 

wiem, że istnieją alternatywy np Mogę użyć ObjectDoesNotExist. Ale czy jest jakiś sposób osiągnięcia pożądanej funkcjonalności w get_or_create?

Powodem, dla którego chcę wykluczyć pole added_by, może być to, że inny użytkownik dodał już inny profil użytkownika.

+2

Dodajesz commit = False get_or_create jest dobry pomysł. Być może zechcesz przenieść tę sugestię na listę dyskusyjną django-developerów. – s29

Odpowiedz

9

Jest defaults argumentem można przekazać get_or_create aby wypełnić te dane dla nowo tworzonych obiektów, które nie są wykorzystywane w filtracji:

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

Powiązane problemy