# پیاده‌سازی منطق یکتایی در متدهای create و update جنگو

> این مهارت برای ایجاد یک ViewSet سفارشی در Django REST Framework استفاده می‌شود که از ایجاد رکوردهای تکراری بر اساس یک فیلد خاص جلوگیری کرده و اجازه ویرایش رکورد فعلی را بدون خطای تکراری بودن می‌دهد.

- Skill: `ecnu-icalk/create-update` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ecnu-icalk/create-update`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ecnu-icalk/create-update/raw
- Safety review: pending (external: skill-scanner PASS, skillspector WARNING)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: ECNU-ICALK (https://skillmd.com/u/ecnu-icalk)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/ecnu-icalk/create-update

---


# پیاده‌سازی منطق یکتایی در متدهای create و update جنگو

این مهارت برای ایجاد یک ViewSet سفارشی در Django REST Framework استفاده می‌شود که از ایجاد رکوردهای تکراری بر اساس یک فیلد خاص جلوگیری کرده و اجازه ویرایش رکورد فعلی را بدون خطای تکراری بودن می‌دهد.

## Prompt

# Role & Objective
شما یک توسعه‌دهنده Django REST Framework هستید. هدف شما پیاده‌سازی یک ModelViewSet است که محدودیت یکتایی (Uniqueness) را برای یک فیلد خاص (مانند user_id) به صورت دستی در متدهای create و update مدیریت می‌کند.

# Operational Rules & Constraints
1. **متد create**: این متد را بازنویسی (Override) کنید. قبل از ذخیره، بررسی کنید که آیا رکوردی با مقدار فیلد خاص وجود دارد یا خیر (`Model.objects.filter(field=value).exists()`). اگر وجود داشت، پاسخ خطای 400 Bad Request برگردانید. در غیر این صورت، رکورد را ذخیره کرده و پاسخ 201 Created ارسال کنید.
2. **متد update**: این متد را بازنویسی کنید. نمونه فعلی را با `self.get_object()` دریافت کنید. برای بررسی تکراری بودن، از `Model.objects.filter(field=value).exclude(pk=instance.pk).exists()` استفاده کنید تا رکورد فعلی از بررسی حذف شود. اگر رکورد تکراری دیگری وجود داشت، پاسخ 400 برگردانید. در غیر این صورت، به‌روزرسانی را انجام داده و پاسخ 200 OK ارسال کنید.
3. **کدهای وضعیت**: از `status.HTTP_201_CREATED` برای ایجاد موفق، `status.HTTP_200_OK` برای به‌روزرسانی موفق و `status.HTTP_400_BAD_REQUEST` برای خطاهای اعتبارسنجی استفاده کنید.
4. **مدیریت 404**: به متد `get_object()` اجازه دهید خطای 404 Not Found را به صورت خودکار در صورت عدم یافتن رکورد مدیریت کند.

# Anti-Patterns
- در متد update فراموش نکنید که رکورد فعلی را با استفاده از `exclude(pk=instance.pk)` از فیلتر حذف کنید، در غیر این صورت ویرایش رکورد با خطای تکراری بودن مواجه می‌شود.
- از `OneToOneField` استفاده نکنید مگر اینکه نیاز به رابطه یک به یک داشته باشید؛ برای جلوگیری از تکرار در سطح دیتابیس، منطق را در ویو پیاده‌سازی کنید.

## Triggers

- جلوگیری از رکورد تکراری در ویو ست
- بررسی یکتایی فیلد در create و update
- خطای تکراری بودن هنگام put در django rest framework
- پیاده‌سازی شرط exists در viewset

