{"id":1626,"date":"2021-08-08T15:40:38","date_gmt":"2021-08-08T06:40:38","guid":{"rendered":"http:\/\/www.agile-software.site\/?p=1626"},"modified":"2021-09-05T15:00:56","modified_gmt":"2021-09-05T06:00:56","slug":"django-reatframeworksns%e7%b7%a8","status":"publish","type":"post","link":"https:\/\/agile-software.net\/?p=1626","title":{"rendered":"Django ReatFramework[SNS\u7de8]"},"content":{"rendered":"\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box3\"><div class=\"kaisetsu-box3-title\">source code<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u4eee\u60f3\u74b0\u5883<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"> \u4eee\u60f3\u74b0\u5883\u69cb\u7bc9 <\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>python3 -m venv myvenv<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"> \u4eee\u60f3\u74b0\u5883\u69cb\u7bc9 <\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>source myvenv\/bin\/activate<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">requirements.txt<\/h2>\n\n\n\n<p>Django\u3067\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3092\u6271\u3048\u308b\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u306bpillow\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>pip3 install -r requirements.txt<\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-jin-gb-block-icon-box jin-icon-caution jin-iconbox\"><div class=\"jin-iconbox-icons\"><i class=\"jic jin-ifont-caution jin-icons\"><\/i><\/div><div class=\"jin-iconbox-main\">\n<p>\u500b\u5225\u306bpillow\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u5834\u5408\u306e\u30b3\u30de\u30f3\u30c9<\/p>\n\n\n\n<p>pip install pillow<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>Django~=3.1.4\ndjangorestframework==3.11.0\npillow~=8.1.0<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>django-admin startproject sns .<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>django-admin startapp core\ndjango-admin startapp api_user\ndjango-admin startapp api_dm<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">settings.py<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"settings.py\"><code>INSTALLED_APPS = [   \n    &#39;rest_framework&#39;,\n    &#39;rest_framework.authtoken&#39;,  \n    &#39;core.apps.CoreConfig&#39;,\n    &#39;api_user.apps.ApiUserConfig&#39;,\n    &#39;api_dm.apps.ApiDmConfig&#39;,\n]<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"settings.py\"><code>TIME_ZONE = &#39;ASIA\/TOKYO&#39;<\/code><\/pre><\/div>\n\n\n\n<p>\u30ed\u30fc\u30ab\u30eb\u30db\u30b9\u30c8\u306e\u672b\u5c3e\u306bmedia<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>MEDIA_ROOT = os.path.join(BASE_DIR, &#39;_media&#39;)\nMEDIA_URL = &#39;\/media\/&#39;<\/code><\/pre><\/div>\n\n\n\n<p>core\u30d5\u30a9\u30eb\u30c0\u3067\u4f5c\u6210\u3057\u305fUser\u30e2\u30c7\u30eb\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u4f7f\u7528\u3059\u308b\u305f\u3081\u306b\u4e0b\u8a18\u306e\u30b3\u30fc\u30c9\u3092\u8ffd\u8a18\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>AUTH_USER_MODEL = &#39;core.User&#39;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">urls.py<\/h2>\n\n\n\n<p>api_user\u3068api_dm\u30d5\u30a9\u30eb\u30c0\u306burls.py\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br>rest_framework\u306b\u642d\u8f09\u3055\u308c\u3066\u3044\u308bobtain_auth_token\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box1\"><div class=\"kaisetsu-box1-title\">urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)<\/div>\n<p>static\u30d5\u30a1\u30a4\u30eb\u306eurl\u30d1\u30bf\u30fc\u30f3\u3092\u7c21\u5358\u306b\u751f\u6210\u3057\u3066\u304f\u308c\u308b\u30e1\u30bd\u30c3\u30c9<\/p>\n<\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from django.urls import path, include\nfrom rest_framework.authtoken import views\nfrom django.conf import settings\nfrom django.conf.urls.static import static\n\nurlpatterns = [   \n \u3000path(&#39;authen\/&#39;, views.obtain_auth_token),\n    path(&#39;api\/user\/&#39;, include(&#39;api_user.urls&#39;)),\n    path(&#39;api\/dm\/&#39;, include(&#39;api_dm.urls&#39;)),\n]\nurlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)<\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box1\"><div class=\"kaisetsu-box1-title\">router<\/div>\n<p>ModelViewSet\u7cfb\u30d3\u30e5\u30fc\u306b\u304a\u3051\u308b\u4e00\u89a7\u30fb\u8a73\u7d30\u30fb\u767b\u9332\u30fb\u66f4\u65b0\u30fb\u4e00\u90e8\u66f4\u65b0\u30fb\u524a\u9664\u306eURL\u30d1\u30bf\u30fc\u30f3\u3092\u307e\u3068\u3081\u3066\u8ffd\u52a0\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>router = DefaultRouter()\nrouter.register(&#39;profile&#39;,views.ProfileViewSet)\nrouter.register(&#39;approval&#39;, views.FriendRequestViewSet)<\/code><\/pre><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<pre class=\"wp-block-preformatted\">URL\u30d1\u30bf\u30fc\u30f3\u3092\u767b\u9332<\/pre>\n<\/div>\n<\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"api_user\/urls.py\"><code>from django.urls import path, include\nfrom api_user import views\nfrom rest_framework.routers import DefaultRouter\n\napp_name = &#39;user&#39;\n\nrouter = DefaultRouter()\nrouter.register(&#39;profile&#39;,views.ProfileViewSet)\nrouter.register(&#39;approval&#39;, views.FriendRequestViewSet)\n\nurlpatterns = [\n    path(&#39;create\/&#39;, views.CreateUserView.as_view(), name=&#39;create&#39;),\n    path(&#39;myprofile\/&#39;, views.MyProfileListView.as_view(), name=&#39;myprofile&#39;),\n    path(&#39;&#39;,include(router.urls))\n]<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"api_dm\/urls.py\"><code>from django.urls import path, include\nfrom rest_framework.routers import DefaultRouter\nfrom api_dm import views\n\napp_name = &#39;dm&#39;\n\nrouter = DefaultRouter()\nrouter.register(&#39;message&#39;, views.MessageViewSet, basename=&quot;message&quot;)\nrouter.register(&#39;inbox&#39;, views.InboxListView, basename=&#39;inbox&#39;)\n\nurlpatterns = [\n    path(&#39;&#39;,include(router.urls))\n]<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">models.py<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">User<\/h3>\n\n\n\n<p>create_user\u306f\u3042\u3089\u304b\u3058\u3081BaseUserManager\u3067\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b\u3002<br>email\u304c\u5165\u3055\u308c\u306a\u304b\u3063\u305f\u5834\u5408\u306f\u30a8\u30e9\u30fc\u3092\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u8a2d\u5b9a\u3002<br>\u5927\u6587\u5b57\u3067\u5165\u529b\u3055\u308c\u305f\u5834\u5408\u306b\u5c0f\u6587\u5b57\u306b\u5909\u63db\u3057\u3066\u304b\u3089\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u767b\u9332\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\nhttp:\/\/www.agile-software.site\/2021\/08\/24\/python-%e3%82%af%e3%83%a9%e3%82%b9\/\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>class UserManager(BaseUserManager):\n\n    def create_user(self, email, password=None, **extra_fields):\n\n        if not email:\n            raise ValueError(&#39;email is must&#39;)\n\n        user = self.model(email=self.normalize_email(email), **extra_fields)\n        user.set_password(password)\n        user.save(using=self._db)\n\n        return user<\/code><\/pre><\/div>\n\n\n\n<p>email\u8a8d\u8a3c\u306b\u5909\u66f4\u3057\u3066\u3044\u308b\u305f\u3081superuser\u306e\u8a18\u8ff0\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<br>\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3057\u305f\u90e8\u5206\u306b\u3064\u3044\u3066\u306f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306bsave\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>    def create_superuser(self, email, password):\n        user = self.create_user(email, password)\n        user.is_staff = True\n        user.is_superuser = True\n        user.save(using= self._db)\n\n        return user<\/code><\/pre><\/div>\n\n\n\n<p>unique\u3092true\u306b\u3057\u3066\u3044\u308b\u3053\u3068\u3067\u9055\u3046\u30e6\u30fc\u30b6\u30fc\u304c\u540c\u3058email\u3067\u65b0\u898f\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box1\"><div class=\"kaisetsu-box1-title\"><\/div>\n<ul class=\"wp-block-list\"><li>AbstractBaseUser<\/li><li>PermissionsMixin\uff1a<\/li><li>BaseUserManager<\/li><\/ul>\n<\/div>\n\n\n\n<p> <span style=\"background-color: rgba(0, 0, 0, 0.2); font-size: 1em; letter-spacing: 0.05em; color: initial;\">AbstractBaseUser\u306f\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u6a5f\u80fd\u3092\u6301\u3063\u3066\u3044\u306a\u3044<\/span>\u305f\u3081\u540c\u6642\u306b\u7d99\u627f \u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>class User(AbstractBaseUser, PermissionsMixin):\n\n    email = models.EmailField(max_length=50, unique=True)\n    is_active = models.BooleanField(default=True)\n    is_staff = models.BooleanField(default=False)\n\n    objects = UserManager()\n\n    USERNAME_FIELD = &#39;email&#39;\n\n    def __str__(self):\n        return self.email<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Profile<\/h3>\n\n\n\n<p>\u4e00\u4eba\u306e\u30e6\u30fc\u30b6\u30fc\u306b\u5bfe\u3057\u3066\u4e00\u3064\u306e\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u3092OnetoOneField\u3067\u5b9a\u7fa9\u3002<\/p>\n\n\n\n<p>\u53c2\u7167\u5148\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u524a\u9664\u3055\u308c\u305f\u5834\u5408\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u3082\u524a\u9664\u3055\u308c\u308b\u3088\u3046\u306bon_delete\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p>auto_now_add=True\u306b\u3059\u308b\u3053\u3068\u3067\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u3092\u4f5c\u6210\u3057\u305f\u3068\u304d\u306e\u6642\u523b\u3092\u767b\u9332<\/p>\n\n\n\n<p>\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb\u753b\u50cf\u3092\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>class Profile(models.Model):\n    nickName = models.CharField(max_length=20)\n    userPro = models.OneToOneField(\n        settings.AUTH_USER_MODEL, related_name=&#39;userPro&#39;,\n        on_delete=models.CASCADE\n    )\n    created_on = models.DateTimeField(auto_now_add=True)\n    img = models.ImageField(blank=True, null=True, upload_to=upload_path)\n\n    def __str__(self):\n        return self.nickName<\/code><\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">upload_path\u306e\u6307\u5b9a<\/h4>\n\n\n\n<p>\u62e1\u5f35\u5b50\u3060\u3051\u3092\u53d6\u308a\u51fa\u3059\u3053\u3068\u304c\u51fa\u6765\u307e\u3059\u3002<br>media\u30d5\u30a9\u30eb\u30c0\u306eimage\u30d5\u30a9\u30eb\u30c0\u306b\u753b\u50cf\u3092\u683c\u7d0d\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>def upload_path(instance, filename):\n    ext = filename.split(&#39;.&#39;)[-1]\n    return &#39;\/&#39;.join([&#39;image&#39;, str(instance.userPro.id)+str(instance.nickName)+str(&quot;.&quot;)+str(ext)])<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">FriendRequest<\/h3>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u306e\u4e2d\u304b\u30891\u4eba\u3092\u9078\u3076\u305f\u3081\u306bForeignKey\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>1\u5ea6\u3060\u3051\u7533\u8acb\u3092\u884c\u3046\u3088\u3046\u306b\u884c\u3046\u3088\u3046\u306baskFrom\u3068askTo\u306e\u7d44\u307f\u5408\u308f\u305b\u304c\u91cd\u8907\u3057\u306a\u3044\u3088\u3046\u306b<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>    class Meta:\n        unique_together = ((&#39;askFrom&#39;, &#39;askTo&#39;),)<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>class FriendRequest(models.Model):\n    askFrom = models.ForeignKey(\n        settings.AUTH_USER_MODEL, related_name=&#39;askFrom&#39;,\n        on_delete=models.CASCADE\n    )\n    askTo = models.ForeignKey(\n        settings.AUTH_USER_MODEL, related_name=&#39;askTo&#39;,\n        on_delete=models.CASCADE\n    )\n    approved = models.BooleanField(default=False)\n\n    class Meta:\n        unique_together = ((&#39;askFrom&#39;, &#39;askTo&#39;),)\n\n    def __str__(self):\n        return str(self.askFrom) + &#39;-----&gt;&#39; + str(self.askTo)<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Message<\/h3>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>class Message(models.Model):\n\n    message = models.CharField(max_length=140)\n    sender = models.ForeignKey(\n        settings.AUTH_USER_MODEL, related_name=&#39;sender&#39;,\n        on_delete=models.CASCADE\n    )\n    receiver = models.ForeignKey(\n        settings.AUTH_USER_MODEL, related_name=&#39;receiver&#39;,\n        on_delete=models.CASCADE\n    )\n\n    def __str__(self):\n        return str(self.sender)<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>python3 manage.py makemigrations\npython3 manage.py migrate<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">admin.py(core)<\/h2>\n\n\n\n<p>\u30de\u30fc\u30ad\u30f3\u30b0<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from django.contrib import admin\nfrom django.contrib.auth.admin import UserAdmin as BaseUserAdmin\nfrom django.utils.translation import gettext as _\nfrom core import models<\/code><\/pre><\/div>\n\n\n\n<p>field<br>Personal Info<br>Permissions<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>\n\nclass UserAdmin(BaseUserAdmin):\n    ordering = [&#39;id&#39;]\n    list_display = [&#39;email&#39;]\n    fieldsets = (\n        (None, {&#39;fields&#39;: (&#39;email&#39;, &#39;password&#39;)}),\n        (_(&#39;Personal Info&#39;), {&#39;fields&#39;: (&#39;&#39;,)}),\n        (\n            _(&#39;Permissions&#39;),\n            {\n                &#39;fields&#39;: (\n                    &#39;is_active&#39;,\n                    &#39;is_staff&#39;,\n                    &#39;is_superuser&#39;,\n                )\n            }\n        ),\n        (_(&#39;Important dates&#39;), {&#39;fields&#39;: (&#39;last_login&#39;,)}),\n    )\n    add_fieldsets = (\n        (None, {\n            &#39;classes&#39;:(&#39;wide&#39;,),\n            &#39;fields&#39;:(&#39;email&#39;,&#39;password1&#39;,&#39;password2&#39;)\n        }),\n    )\n\n\n\nadmin.site.register(models.User, UserAdmin)\nadmin.site.register(models.Profile)\nadmin.site.register(models.Message)\nadmin.site.register(models.FriendRequest)<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>(myvenv) ~$ python3 manage.py makemigrations\n(myvenv) ~$ python3 manage.py migrate<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>python3 manage.py createsuperuser<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">serializers.py<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">api_user&gt;serializers.py <\/h3>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from django.contrib.auth import get_user_model\nfrom rest_framework import serializers\nfrom rest_framework.authtoken.models import Token\nfrom core.models import Profile, FriendRequest\n\nclass UserSerializer(serializers.ModelSerializer):\n\n    class Meta:\n        model = get_user_model()\n        fields = (&#39;id&#39;,&#39;email&#39;,&#39;password&#39;)\n        extra_kwargs= {&#39;password&#39;: {&#39;write_only&#39;: True}}\n\n    def create(self, validated_data):\n        user = get_user_model().objects.create_user(**validated_data)\n        Token.objects.create(user=user)\n        return user\n\nclass ProfileSerializer(serializers.ModelSerializer):\n\n    created_on = serializers.DateTimeField(format=&quot;%Y-%m-%d&quot;, read_only=True)\n\n    class Meta:\n        model=Profile\n        fields = (&#39;id&#39;, &#39;nickName&#39;, &#39;userPro&#39;, &#39;created_on&#39;, &#39;img&#39;)\n        extra_kwargs = {&#39;userPro&#39;: {&#39;read_only&#39;: True}}\n\nclass FriendRequestSerializer(serializers.ModelSerializer):\n    class Meta:\n        model = FriendRequest\n        fields = (&#39;id&#39;,&#39;askFrom&#39;,&#39;askTo&#39;,&#39;approved&#39;)\n        extra_kwargs = {&#39;askFrom&#39;: {&#39;read_only&#39;: True}}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">api_dm&gt;serializers.py <\/h3>\n\n\n\n<p>Q\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092import\u3057\u3066\u3044\u307e\u3059\u3002<br>Q\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u3064\u3044\u3066\u306f\u4e0b\u8a18\u8a18\u4e8b\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\nhttp:\/\/www.agile-software.site\/2021\/08\/09\/q%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88\/\n\n\n\n<p> \u30ed\u30b0\u30a4\u30f3\u3057\u3066\u3044\u308b\u30e6\u30fc\u30b6\u30fc\u304csender\u306b\u306a\u308b\u3002<\/p>\n\n\n\n<p>\u53cb\u9054\u7533\u8acb\u304c\u627f\u8a8d\u3055\u308c\u3066\u3044\u308b\u30e6\u30fc\u30b6\u30fc\u306b\u5bfe\u3057\u3066\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u9001\u308c\u308b\u3088\u3046\u306bFriendFilter\u3067\u5236\u9650\u3057\u3066\u3044\u307e\u3059\u3002<br>askTo\u304c\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u3044\u308b\u30e6\u30fc\u30b6\u30fc\u304b\u3064approved=True\u3067\u627f\u8a8d\u3055\u308c\u3066\u3044\u308b<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from rest_framework import serializers\nfrom core.models import Message, User, Profile, FriendRequest\nfrom django.db.models import Q\n\nclass FriendsFilter(serializers.PrimaryKeyRelatedField):\n\n    def get_queryset(self):\n        request = self.context[&#39;request&#39;]\n        friends = FriendRequest.objects.filter(Q(askTo=request.user) & Q(approved=True))\n\n        list_friend = []\n        for friend in friends:\n            list_friend.append(friend.askFrom.id)\n\n        queryset = User.objects.filter(id__in=list_friend)\n        return queryset\n\nclass MessageSerializer(serializers.ModelSerializer):\n\n    receiver = FriendsFilter()\n\n    class Meta:\n        model = Message\n        fields = (&#39;id&#39;, &#39;sender&#39;, &#39;receiver&#39;, &#39;message&#39;)\n        extra_kwargs = {&#39;sender&#39;: {&#39;read_only&#39;: True}}<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">views.py<\/h2>\n\n\n\n<p>\u30e6\u30fc\u30b6\u30fc\u306e\u65b0\u898f\u4f5c\u6210<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>class CreateUserView(generics.CreateAPIView):\n    serializer_class = serializers.UserSerializer<\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4eee\u60f3\u74b0\u5883 \u4eee\u60f3\u74b0\u5883\u69cb\u7bc9 \u4eee\u60f3\u74b0\u5883\u69cb\u7bc9 requirements.txt Django\u3067\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3092\u6271\u3048\u308b\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u306bpillow\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u304d\u307e\u3059\u3002 \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u4f5c\u6210 settings<\/p>\n","protected":false},"author":1,"featured_media":1718,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jin_ogp_image_url":"","_jin_last_featured_id":0,"footnotes":""},"categories":[39],"tags":[],"class_list":["post-1626","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-django-rest-framework"],"_links":{"self":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/1626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1626"}],"version-history":[{"count":4,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/1626\/revisions"}],"predecessor-version":[{"id":1705,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/1626\/revisions\/1705"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/media\/1718"}],"wp:attachment":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}