10

I want to create a table where two of its fields combine to form an index field. My Python code for creating the table is as follows. What I want to do is make the combined fields course_name and group_name unique so that no two groups with the same course_name and group_name can be created. Can someone please help me with this?

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")

2 Answers 2

14

You can specify indexes in the meta dict of the class:

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}
        ]
    }
Sign up to request clarification or add additional context in comments.

Comments

4

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

You may also specify multi-field uniqueness constraints by using unique_with, which may be either a single field name, or a list or tuple of field names

In your case:

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')

Or more complicated:

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'])

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.