{"record":{"id":"a479f411a21a2f83","repo":"khoj-ai/khoj","slug":"an-entry-cannot-be-associated-with-both-a-user-and","errorCode":null,"errorMessage":"An Entry cannot be associated with both a user and an agent.","messagePattern":"An Entry cannot be associated with both a user and an agent\\.","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"src/khoj/database/models/__init__.py","lineNumber":803,"sourceCode":"    user = models.ForeignKey(KhojUser, on_delete=models.CASCADE, default=None, null=True, blank=True)\n    agent = models.ForeignKey(Agent, on_delete=models.CASCADE, default=None, null=True, blank=True)\n    embeddings = VectorField(dimensions=None)\n    raw = models.TextField()\n    compiled = models.TextField()\n    heading = models.CharField(max_length=1000, default=None, null=True, blank=True)\n    file_source = models.CharField(max_length=30, choices=EntrySource.choices, default=EntrySource.COMPUTER)\n    file_type = models.CharField(max_length=30, choices=EntryType.choices, default=EntryType.PLAINTEXT)\n    file_path = models.CharField(max_length=400, default=None, null=True, blank=True)\n    file_name = models.CharField(max_length=400, default=None, null=True, blank=True)\n    url = models.URLField(max_length=400, default=None, null=True, blank=True)\n    hashed_value = models.CharField(max_length=100)\n    corpus_id = models.UUIDField(default=uuid.uuid4, editable=False)\n    search_model = models.ForeignKey(SearchModelConfig, on_delete=models.SET_NULL, default=None, null=True, blank=True)\n    file_object = models.ForeignKey(FileObject, on_delete=models.CASCADE, default=None, null=True, blank=True)\n\n    def save(self, *args, **kwargs):\n        if self.user and self.agent:\n            raise ValidationError(\"An Entry cannot be associated with both a user and an agent.\")\n\n\nclass EntryDates(DbBaseModel):\n    date = models.DateField()\n    entry = models.ForeignKey(Entry, on_delete=models.CASCADE, related_name=\"embeddings_dates\")\n\n    class Meta:\n        indexes = [\n            models.Index(fields=[\"date\"]),\n        ]\n\n\nclass UserRequests(DbBaseModel):\n    \"\"\"Stores user requests to the server for rate limiting.\"\"\"\n\n    user = models.ForeignKey(KhojUser, on_delete=models.CASCADE)\n    slug = models.CharField(max_length=200)\n","sourceCodeStart":785,"sourceCodeEnd":821,"githubUrl":"https://github.com/khoj-ai/khoj/blob/ae229ca894c0b80ad84664afcfdde523b5e87057/src/khoj/database/models/__init__.py#L785-L821","documentation":"Entry.save() raises ValidationError when an Entry row has both user and agent foreign keys set. Entries must be scoped to exactly one owner: either a KhojUser or an Agent, never both.","triggerScenarios":"Entry.objects.create(user=u, agent=a, ...) or setting entry.agent while entry.user is already set, then saving.","commonSituations":"Indexing code that attaches shared content to an agent while forgetting to clear the user field; bulk import scripts setting both ownership fields.","solutions":["Decide the owner: set user=None when the entry belongs to an agent, or agent=None for user-owned entries.","Audit code paths that copy/duplicate entries (cloning often copies both FKs).","Add a form/serializer-level check so the constraint is caught before save."],"exampleFix":"# before\nEntry.objects.create(user=user, agent=agent, compiled_content=content)\n\n# after\nEntry.objects.create(user=None, agent=agent, compiled_content=content)","handlingStrategy":"validation","validationCode":"assert not (entry.user and entry.agent), \"Entry cannot have both user and agent\"\n# before create:\nEntry.objects.create(user=user if owner_is_user else None,\n                     agent=agent if not owner_is_user else None,\n                     compiled_content=content)","typeGuard":"def entry_has_single_owner(entry) -> bool:\n    return bool(entry.user) != bool(entry.agent)","tryCatchPattern":"from django.core.exceptions import ValidationError\ntry:\n    entry.save()\nexcept ValidationError as e:\n    if \"both a user and an agent\" in str(e):\n        if keep_agent_owner:\n            entry.user = None\n        else:\n            entry.agent = None\n        entry.save()\n    else:\n        raise","preventionTips":["Decide ownership at creation time and set exactly one FK.","Review clone/copy code paths that duplicate both FKs.","Enforce single-owner in forms/serializers with a clean() hook."],"tags":["khoj","django","entry","ownership","validation"],"backgroundTag":"mutually-exclusive-field-constraint","analyzedSha":"ae229ca894c0b80ad84664afcfdde523b5e87057","analyzedAt":"2026-08-27T03:32:41.843Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}