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?