0

I'm looking for a way/function/method to make it impossible to save two identical names on my JSON, for example, I got this JSON with repeated names:

[
  [
    {
      "id": "59a5c80dc75969297837c51e",
      "name": "uza",
      "password": "3648726"
    },
    {}
  ],
  [
    {
      "id": "59a5c811c75969297837c51f",
      "name": "kuza",
      "password": "3648726"
    },
    {}
  ],
  [
    {
      "id": "59a5c83ec75969297837c520",
      "name": "kuza",
      "password": "3648726"
    },
    {}
  ]
]

My code that creates an user is this one:

@api.route('/', methods=['POST'])
def create():

# Grabs the data from the requisition
user_json = request.get_json(silent=True)
if not user_json:
    return "FAIL"

# creates an entity JSON
user, errors = schema.load(user_json)
if bool(errors):
    return jsonify(errors)
    user.save()
return "SUCCESS"

Again, I'm using mongoengine, anybody knows how to do it?

Edited to add my model.py

rom mongoengine import Document
from mongoengine import StringField, ReferenceField

import marshmallow_mongoengine as ma

from marshmallow import Schema, fields

from .service import ImageService

class User(Document):
    name = StringField(unique=True)
    password = StringField(unique=True)

class Face(Document):
    user = ReferenceField(User)
    image = StringField()
    embedding = StringField()

    def get_embedding(self):
        return ImageService().from_base64_flat(self.embedding.encode())

    def get_image(self):
        return ImageService().from_base64(self.image.encode())

class UserSchema(ma.ModelSchema):
    class Meta:
        model = User

class FaceSchema(ma.ModelSchema):
    class Meta:
        model = Face

    image = ma.fields.Method(deserialize="img_to_base64", serialize="img_to_base64")
    embedding = ma.fields.Method(deserialize="to_base64", serialize="to_base64")

    def img_to_base64(self, data):
        return ImageService().to_base64(data)

    def to_base64(self, data):
        return ImageService().np_to_base64(data)

In the class User i changed it from required to unique, now i can't add one with the same name but in exchange it returns an INTERNAL SERVER ERROR on Insomnia, and as you can see i put another unique on the password for test and it didn't worked it saves even if there is another user with the same password.

1 Answers1

0

Try this

class User(Document):
    name = StringField(unique=True)
    password = StringField(unique=True)
    meta = {       
        'indexes': [{'fields': ['name'], 'unique': True}]
   }
Tarun Lalwani
  • 142,312
  • 9
  • 204
  • 265