ReferenceField only accepts DBRef, LazyReference, ObjectId or documents

25 Views Asked by At

Based on this question I still have problem, when I don't use the .to_dbref(). These are my models implementation:

class BaseDocument(Document):
    # mark: variables
    id = StringField(required=True, primary_key=True, default=lambda: uuid.uuid4().hex)

    created_at = DateTimeField(required=True, default=datetime.datetime.utcnow)
    updated_at = DateTimeField(required=False)

    is_deleted = BooleanField(required=True, default=False)
    deleted_at = DateTimeField(required=False)

    # mark: meta
    meta = {
        "abstract": True,
        "allow_inheritance": True,
        "indexes": ["id", "created_at", "updated_at", "deleted_at", "is_deleted"],
    }

class Organization(BaseDocument):
    # mark: variables
    name = StringField(required=True, unique=True)
    status = IntField(required=True)
    coordinator = StringField(required=True)
    coordinator_phone_number = StringField(required=True)
    type = EnumField(OrganizationTypeFieldEnum, required=True)
    employee_number = IntField(required=True, min_value=1)
    activity_field = EnumField(OrganizationActivityFieldEnum, required=True)
    has_verified_admin = BooleanField(required=True, default=False)
    national_code = StringField(required=True, unique=True, min_length=11, max_length=11)
    register_code = StringField(required=True, unique=True, max_length=6)

    # mark: meta

    meta = {"collection": "organizations", "indexes": ["name", "type", "activity_field"]}

class OrganizationAdmin(BaseDocument):
    # mark: variables
    username = StringField(required=True, unique=True)
    name = StringField(required=True)
    organization = ReferenceField("Organization")

    enabled = BooleanField(required=True, default=True)

    phone_number = StringField(required=True, unique=True)
    is_phone_number_verified = BooleanField(required=True, default=False)

    password = StringField(required=True)
    need_change_password = BooleanField(required=True, default=True)

    is_active = BooleanField(required=True, default=True)

    permissions = EmbeddedDocumentListField(Permission)

    # mark: meta

    meta = {"collection": "organization_admins", "indexes": ["phone_number", "username"]}

And somewhere in my code I have these lines:

json_draft = json.loads(draft)
organization: Organization = Organization.objects.get(id=json_draft.pop("organization_id"))

admin: OrganizationAdmin = OrganizationAdmin()
admin.need_change_password = True
admin.populate(json_draft)

admin.organization = organization
admin.save()

And I get ValidationError (OrganizationAdmin:36f28da86f8244fdbeb3a8acd91453b8) (A ReferenceField only accepts DBRef, LazyReference, ObjectId or documents: ['organization']) error. But when I convert the organization object to dbref using organization.to_dbref method, I'm able to save the document. Why I can't add the organization directly to my object? what's the difference between a simple fetched object from db and it's db_ref one? What should I implement and write to do it directly?

0

There are 0 best solutions below