2013-02-21 11 views
5

Voglio creare una tabella in cui due dei suoi campi si combinano per formare un campo indice. Il mio codice Python per creare la tabella è il seguente. Quello che voglio fare è rendere i campi combinati course_name e group_name unici in modo che non possano essere creati due gruppi con lo stesso course_name e group_name. Qualcuno può aiutarmi per favore con questo?Come rendere un set combinato di campi univoci in Mongodb in Python

class SocialGroup(Document): 
    timestamp = DateTimeField(default=datetime.now) 
    course_name = StringField() 
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None") 

risposta

7

È possibile specificare indexes nel meta dict della classe:

class SocialGroup(Document): 
    timestamp = DateTimeField(default=datetime.now) 
    course_name = StringField() 
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None") 
    meta = { 
     'indexes': [ 
      {'fields': ('course_name', 'group_name'), 'unique': True} 
     ] 
    } 
0

Da: http://docs.mongoengine.org/guide/defining-documents.html#uniqueness-constraints

È inoltre possibile specificare multi-campo vincoli unicità utilizzando unique_with, che può essere un singolo nome di campo o un elenco o nomi di tupla di campi

Nel tuo caso:

class SocialGroup(Document): 
    timestamp = DateTimeField(default=datetime.now) 
    course_name = StringField() 
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None", 
          unique_with='course_name') 

O più complicata:

group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None", 
         unique_with=['course_name', 'another_field', 'more_field'])