<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gahyun Son</title>
    <description>The latest articles on Forem by Gahyun Son (@hyun_hyun).</description>
    <link>https://forem.com/hyun_hyun</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2171015%2F475bdd8e-134d-4d6d-bb52-3bb548dc664f.jpeg</url>
      <title>Forem: Gahyun Son</title>
      <link>https://forem.com/hyun_hyun</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hyun_hyun"/>
    <language>en</language>
    <item>
      <title>useContext vs Redux toolkit</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Sun, 02 Mar 2025 14:19:59 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/usecontext-vs-redux-toolkit-61k</link>
      <guid>https://forem.com/hyun_hyun/usecontext-vs-redux-toolkit-61k</guid>
      <description>&lt;p&gt;I'm a newbie in Redux and React. Recently I've been developing a project with React, and I'm working on structuring the user authentication API and managing user information using Redux. I need to deepen my knowledge of Redux and React because it's quite challenging for a beginner. &lt;br&gt;
I found &lt;a href="https://www.osedea.com/insight/handling-global-state-in-react-in-2022" rel="noopener noreferrer"&gt;an article&lt;/a&gt; about Handling global state. This article introduces various options for managing global state. &lt;br&gt;
One of things that I wanted to explore was the 'context'. Below are some simple code examples to check the difference between React context and Redux.&lt;/p&gt;
&lt;h1&gt;
  
  
  useContext (React)
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Declaring the Context. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;First, I declare a context using &lt;code&gt;createContext&lt;/code&gt;. It is the default value. And you can set a value with &lt;code&gt;useState&lt;/code&gt; if you want(If you don't declare value then default value will be used)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const ThemeContext = createContext('light');

const Main = () =&amp;gt; {
  const [theme, setTheme] = useState('light');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Providing a value in ThemeContext.Provider. 
'theme' or everything is good. but if you need a dynamic value, you should use &lt;code&gt;useState&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;ThemeContext.Provider value={'theme'}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Using Global state?
In this case, accessing &lt;code&gt;{theme}&lt;/code&gt; inside the &lt;code&gt;Panel&lt;/code&gt; component works well. Because &lt;code&gt;Panel&lt;/code&gt; is a child of &lt;code&gt;Main&lt;/code&gt;. I tried changing the value, and it updated correctly on screen.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Panel({ title, children }) {
  const theme = useContext(ThemeContext);
  const className = 'panel-' + theme;
  return (
    &amp;lt;section className={className}&amp;gt;
      &amp;lt;h1&amp;gt;{title} and {theme}&amp;lt;/h1&amp;gt;
      {children}
    &amp;lt;/section&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'd tried here too. The initial value was displayed correctly, but when i tried changing it on screen, it didn't update. This happens because &lt;code&gt;Test&lt;/code&gt; is not relevant with Main or Panel anything (not within the ThemeContext.Provider). So it only show us the default value or initial value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function Test() {
  const theme = useContext(ThemeContext);
  return (
    &amp;lt;p&amp;gt;This is {theme}&amp;lt;/p&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Redux toolkit
&lt;/h1&gt;

&lt;p&gt;I used Redux toolkit, It's very simple calling global state.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const count = useSelector(state =&amp;gt; state.counter.value)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You just add it to a component.&lt;br&gt;
The components don't have to have a relevant. You don't have to pass a prop.&lt;br&gt;
I could see the changing value when I click the button everywhere I insert above code.&lt;/p&gt;




&lt;p&gt;So some articles say React Context is not for managing global state. OK I understand now. If I try to use react context as managing global state, I will have headache. I'm so happy that I'm using Redux.&lt;/p&gt;

</description>
      <category>react</category>
      <category>redux</category>
      <category>programming</category>
    </item>
    <item>
      <title>Add URLs to the list on the Admin Page Index.</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Sat, 14 Dec 2024 13:27:58 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/add-urls-to-the-list-on-the-admin-page-index-5dpp</link>
      <guid>https://forem.com/hyun_hyun/add-urls-to-the-list-on-the-admin-page-index-5dpp</guid>
      <description>&lt;p&gt;In this post, I'll show you how to add a custom view URL to the list on the admin page index.&lt;br&gt;
Here's what the result will look like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finb4vwen7j2q15b9fzkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finb4vwen7j2q15b9fzkt.png" alt="Image description" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added a custom list to the index to apply the CSS style of the Django admin page.&lt;/p&gt;


&lt;h1&gt;
  
  
  Overriding 'app_list.html'
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Step 1. Create the Template Directory
&lt;/h2&gt;

&lt;p&gt;Create a directory &lt;code&gt;/templates/admin&lt;/code&gt; in your Django Project. And create a file &lt;code&gt;app_list.html&lt;/code&gt; in the directory.&lt;br&gt;
The structure will look like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Django-Project
├── Dockerfile
├── README.md
├── app
│   ├── projectname
│   ├── core
│   ├── manage.py
│   ├── appname1
│   ├── templates
│   │   └── admin
│   │       ├── app_list.html
│   └── appname2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2. Find the Original &lt;code&gt;app_list.html&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Visit the &lt;a href="'https://github.com/django/django/blob/main/django/contrib/admin/templates/admin/app_list.html'"&gt;Django GitHub repository&lt;/a&gt;.&lt;br&gt;
Search for the 'app_list.html' file.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3. Copy the Original Code
&lt;/h2&gt;

&lt;p&gt;Copy the entire content of the 'app_list.html' file.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4. Paste the Code into Your file
&lt;/h2&gt;

&lt;p&gt;Paste the copied codes into your &lt;code&gt;app_list.html&lt;/code&gt; file.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5. Locate the Insertion Point
&lt;/h2&gt;

&lt;p&gt;Let's see where could we insert our codes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{% load i18n %}

&lt;span class="c"&gt;&amp;lt;!-- Insert your codes HERE! --&amp;gt;&lt;/span&gt;
{% if app_list %}
  {% for app in app_list %}
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"app-{{ app.app_label }} module{% if app.app_url in request.path|urlencode %} current-app{% endif %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;caption&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{{ app.app_url }}"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{{ app.name }}&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/caption&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;thead&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"visually-hidden"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{% translate 'Model name' %}&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{% translate 'Add link' %}&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{% translate 'Change or view list link' %}&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6. Add Your Custom Code
&lt;/h2&gt;

&lt;p&gt;I add codes like below. Be mindful of the class names and tags to ensure proper styling and functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;{% load i18n %}


&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"module"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;caption&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"section"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"new-table"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{% translate 'Custom Admin View' %}&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/caption&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;{% translate 'Create API List' %}&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"col"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{% url 'my-api' %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Custom Admin View&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;a&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;th&lt;/span&gt; &lt;span class="na"&gt;scope=&lt;/span&gt;&lt;span class="s"&gt;"row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;a&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  {% if app_list %}
  {% for app in app_list %}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>django</category>
      <category>djangocustom</category>
      <category>admincustom</category>
      <category>djangoadmin</category>
    </item>
    <item>
      <title>Django API | queryset &amp; object, filter() &amp; get()</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Thu, 28 Nov 2024 09:36:53 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/django-api-queryset-object-5e5a</link>
      <guid>https://forem.com/hyun_hyun/django-api-queryset-object-5e5a</guid>
      <description>&lt;p&gt;I tried this unittest.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_price_of_photo_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;photo1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_photos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;create_prices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;photo1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detail_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;photo1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTP_200_OK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and I got an error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;TypeError: &lt;span class="s1"&gt;'Photos'&lt;/span&gt; object is not iterable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First, Let's go to the views.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PhotoDetailView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListAPIView&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;serializer_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PhotoDetailSerializer&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;queryset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Photos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photo_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;queryset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wrote a Photo object. It could be cause.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.get(): returns a object.&lt;/li&gt;
&lt;li&gt;.filter(): returns a queryset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OK. We can't return a object to run. Then why?&lt;/p&gt;

&lt;p&gt;ListAPIView expects a queryset. (not a object)&lt;br&gt;
In documents,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ListAPIView&lt;br&gt;
Used for read-only endpoints to represent a collection of model instances.&lt;br&gt;
Provides a get method handler.&lt;br&gt;
Extends: GenericAPIView, ListModelMixin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Move to GenericAPIView and ListModelMixin.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GenericAPIView&lt;br&gt;
This class extends REST framework's APIView class, adding commonly required behavior for standard list and detail views.&lt;br&gt;
Each of the concrete generic views provided is built by combining GenericAPIView, with one or more mixin classes.&lt;br&gt;
Attributes&lt;br&gt;
Basic settings:&lt;br&gt;
The following attributes control the basic view behavior.&lt;br&gt;
queryset - The queryset that should be used for returning objects from this view. Typically, you must either set this attribute, or override the get_queryset() method. If you are overriding a view method, it is important that you call get_queryset() instead of accessing this property directly, as queryset will get evaluated once, and those results will be cached for all subsequent requests.&lt;/p&gt;

&lt;p&gt;ListModelMixin&lt;br&gt;
Provides a .list(request, *args, **kwargs) method, that implements listing a queryset.&lt;br&gt;
If the queryset is populated, this returns a 200 OK response, with a serialized representation of the queryset as the body of the response. The response data may optionally be paginated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you can see two api expect queryset. Then what I can modify?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.filter(): returns a queryset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's change the method to filter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PhotoDetailView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListAPIView&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;serializer_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PhotoDetailSerializer&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;queryset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Photos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;photo_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;queryset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wow, it works! I'm happy&lt;/p&gt;

</description>
      <category>drf</category>
    </item>
    <item>
      <title>AssertionError: 403</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Thu, 28 Nov 2024 08:49:23 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/assertionerror-403-kgc</link>
      <guid>https://forem.com/hyun_hyun/assertionerror-403-kgc</guid>
      <description>&lt;p&gt;The error messages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apple@GH-MacBook-Pro hyunphoto-cbv % docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; app sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"python manage.py test"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Creating 1/0
 ✔ Container hyunphoto-cbv-db-1  Running                                                                                             0.0s 
Creating &lt;span class="nb"&gt;test &lt;/span&gt;database &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;...
System check identified no issues &lt;span class="o"&gt;(&lt;/span&gt;0 silenced&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
..............FFFWaiting &lt;span class="k"&gt;for &lt;/span&gt;database...
Database unavailable, wating 1 second ...
Database unavailable, wating 1 second ...
Database unavailable, wating 1 second ...
Database unavailable, wating 1 second ...
Database unavailable, wating 1 second ...
Database available!
.Waiting &lt;span class="k"&gt;for &lt;/span&gt;database...
Database available!
&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;======================================================================&lt;/span&gt;
FAIL: test_signup_user_exist_error &lt;span class="o"&gt;(&lt;/span&gt;user.tests.test_user_api.PublicUserApiTests&lt;span class="o"&gt;)&lt;/span&gt;
Test signup a user is fail, email already exists.
&lt;span class="nt"&gt;----------------------------------------------------------------------&lt;/span&gt;
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
  File &lt;span class="s2"&gt;"/app/user/tests/test_user_api.py"&lt;/span&gt;, line 47, &lt;span class="k"&gt;in &lt;/span&gt;test_signup_user_exist_error
    self.assertEqual&lt;span class="o"&gt;(&lt;/span&gt;res.status_code, status.HTTP_400_BAD_REQUEST&lt;span class="o"&gt;)&lt;/span&gt;
AssertionError: 403 &lt;span class="o"&gt;!=&lt;/span&gt; 400

&lt;span class="o"&gt;======================================================================&lt;/span&gt;
FAIL: test_signup_user_password_short_error &lt;span class="o"&gt;(&lt;/span&gt;user.tests.test_user_api.PublicUserApiTests&lt;span class="o"&gt;)&lt;/span&gt;
Test signup a user is fail, password is too short.
&lt;span class="nt"&gt;----------------------------------------------------------------------&lt;/span&gt;
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
  File &lt;span class="s2"&gt;"/app/user/tests/test_user_api.py"&lt;/span&gt;, line 58, &lt;span class="k"&gt;in &lt;/span&gt;test_signup_user_password_short_error
    self.assertEqual&lt;span class="o"&gt;(&lt;/span&gt;res.status_code, status.HTTP_400_BAD_REQUEST&lt;span class="o"&gt;)&lt;/span&gt;
AssertionError: 403 &lt;span class="o"&gt;!=&lt;/span&gt; 400

&lt;span class="o"&gt;======================================================================&lt;/span&gt;
FAIL: test_signup_user_success &lt;span class="o"&gt;(&lt;/span&gt;user.tests.test_user_api.PublicUserApiTests&lt;span class="o"&gt;)&lt;/span&gt;
Test creating/signup a user is successful.
&lt;span class="nt"&gt;----------------------------------------------------------------------&lt;/span&gt;
Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:
  File &lt;span class="s2"&gt;"/app/user/tests/test_user_api.py"&lt;/span&gt;, line 32, &lt;span class="k"&gt;in &lt;/span&gt;test_signup_user_success
    self.assertEqual&lt;span class="o"&gt;(&lt;/span&gt;res.status_code, status.HTTP_201_CREATED&lt;span class="o"&gt;)&lt;/span&gt;
AssertionError: 403 &lt;span class="o"&gt;!=&lt;/span&gt; 201

&lt;span class="nt"&gt;----------------------------------------------------------------------&lt;/span&gt;
Ran 19 tests &lt;span class="k"&gt;in &lt;/span&gt;8.604s

FAILED &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;failures&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt;
Destroying &lt;span class="nb"&gt;test &lt;/span&gt;database &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The causes can be &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;views.py&lt;/li&gt;
&lt;li&gt;serializers.py&lt;/li&gt;
&lt;li&gt;something else&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It was my views.py code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateUserView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListCreateAPIView&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;serializer_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UserSerializer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I couldn't believe this situation. Because it worked very well yesterday. I don't know why it doesn't work but I have to figure out.&lt;/p&gt;

&lt;p&gt;I have suspicion to permission.&lt;/p&gt;

&lt;p&gt;I modified views.py and&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateUserView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateAPIView&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;serializer_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UserSerializer&lt;/span&gt;
    &lt;span class="n"&gt;permission_classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AllowAny&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It fixed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;----------------------------------------------------------------------&lt;/span&gt;
Ran 19 tests &lt;span class="k"&gt;in &lt;/span&gt;8.788s

OK
Destroying &lt;span class="nb"&gt;test &lt;/span&gt;database &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="s1"&gt;'default'&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I just... still have a question... Why it worked yesterday...?&lt;/p&gt;

</description>
      <category>drf</category>
      <category>django</category>
    </item>
    <item>
      <title>extra_kwargs arguments</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Wed, 27 Nov 2024 12:39:21 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/extrakwargs-358e</link>
      <guid>https://forem.com/hyun_hyun/extrakwargs-358e</guid>
      <description>&lt;p&gt;I want to set up minimum length to password value. I looked for this argument but just got confused. Here is my steps to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is the code defined the password?
&lt;/h2&gt;

&lt;p&gt;I didn't define the password in the User model. I set up on serializer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelSerializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_model&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;extra_kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;write_only&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  If I want to set the password minimum length,
&lt;/h2&gt;

&lt;p&gt;I think &lt;code&gt;extra_kwargs&lt;/code&gt; is also a kind of field. And you can see the documentation.&lt;/p&gt;

&lt;p&gt;|&lt;a href="'https://www.django-rest-framework.org/api-guide/serializers/'"&gt;There is also a shortcut allowing you to specify arbitrary additional keyword arguments on fields, using the extra_kwargs option.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It means &lt;code&gt;extra_kwargs&lt;/code&gt; is a option to set arguments on fields.&lt;br&gt;
So we need to see how to set arguments on fields.&lt;/p&gt;
&lt;h2&gt;
  
  
  Serializer fields
&lt;/h2&gt;

&lt;p&gt;So we are here. As you can see here &lt;a href="'https://www.django-rest-framework.org/api-guide/fields/#core-arguments'"&gt;documentation&lt;/a&gt;,&lt;/p&gt;

&lt;p&gt;There are common arguments - Core arguments.&lt;br&gt;
And we can see arguments each field types.&lt;/p&gt;

&lt;p&gt;I want to set minimum length of password, it belongs to Charfield. Let's go to the Charfield list.&lt;/p&gt;

&lt;p&gt;Signature: CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)&lt;/p&gt;
&lt;h2&gt;
  
  
  CharField
&lt;/h2&gt;

&lt;p&gt;Now I find &lt;code&gt;min_length&lt;/code&gt; argument! I'm going to set this on my code!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ModelSerializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_model&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;extra_kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;write_only&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;min_length&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's hard to comprehend the documents right away. But we just need time, we can solve it!&lt;br&gt;
Now I'm happy!&lt;/p&gt;

</description>
      <category>django</category>
      <category>drf</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Docker error: port is already allocated</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Tue, 26 Nov 2024 07:12:21 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/docker-error-port-is-already-allocated-2pm3</link>
      <guid>https://forem.com/hyun_hyun/docker-error-port-is-already-allocated-2pm3</guid>
      <description>&lt;p&gt;Where is the port allocated?&lt;/p&gt;

&lt;p&gt;I got an error message when I tried &lt;code&gt;docker compose up&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
Attaching to app-1
Gracefully stopping... &lt;span class="o"&gt;(&lt;/span&gt;press Ctrl+C again to force&lt;span class="o"&gt;)&lt;/span&gt;
Error response from daemon: driver failed programming external connectivity on endpoint hyunphoto-cbv-app-1 &lt;span class="o"&gt;(&lt;/span&gt;876c605de16e8d99e9e1b806de&lt;span class="o"&gt;)&lt;/span&gt;: Bind &lt;span class="k"&gt;for &lt;/span&gt;0.0.0.0:8000 failed: port is already allocated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What did I do before?&lt;br&gt;
I remembered that I had run a project on Docker earlier. That could be cause. Then, how we could check it? &lt;/p&gt;

&lt;p&gt;I checked by two steps. &lt;br&gt;
First. Command &lt;code&gt;docker compose down&lt;/code&gt; what I ran the project before. I could get the info which container is still running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;!&lt;/span&gt; Network hyunphoto-fbv_default  Resource is still &lt;span class="k"&gt;in &lt;/span&gt;use                                            0.0s 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Second. Command &lt;code&gt;docker network inspect hyunphoto-fbv_default&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"Name"&lt;/span&gt;: &lt;span class="s2"&gt;"hyunphoto-fbv_default"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Id"&lt;/span&gt;: &lt;span class="s2"&gt;"eee2041694529e233c352c6e314"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Created"&lt;/span&gt;: &lt;span class="s2"&gt;"2024-11-15T14:15:07.24638069Z"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Scope"&lt;/span&gt;: &lt;span class="s2"&gt;"local"&lt;/span&gt;, &lt;span class="c"&gt;# this network works only in local.&lt;/span&gt;
        &lt;span class="s2"&gt;"Driver"&lt;/span&gt;: &lt;span class="s2"&gt;"bridge"&lt;/span&gt;, &lt;span class="c"&gt;# Docker network type. &lt;/span&gt;
        &lt;span class="s2"&gt;"EnableIPv6"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"IPAM"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"Driver"&lt;/span&gt;: &lt;span class="s2"&gt;"default"&lt;/span&gt;,
            &lt;span class="s2"&gt;"Options"&lt;/span&gt;: null,
            &lt;span class="s2"&gt;"Config"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
                &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"Subnet"&lt;/span&gt;: &lt;span class="s2"&gt;"172.20.0.0/16"&lt;/span&gt;, &lt;span class="c"&gt;# IP address of this network.&lt;/span&gt;
                    &lt;span class="s2"&gt;"Gateway"&lt;/span&gt;: &lt;span class="s2"&gt;"172.20.0.1"&lt;/span&gt; &lt;span class="c"&gt;# Gateway IP of this network.&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;]&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"Internal"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"Attachable"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"Ingress"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"ConfigFrom"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"Network"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"ConfigOnly"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"Containers"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c"&gt;# This container is running.&lt;/span&gt;
            &lt;span class="s2"&gt;"20ea5e895019ac3279ce5009a6"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"Name"&lt;/span&gt;: &lt;span class="s2"&gt;"hyunphoto-fbv-proxy-1"&lt;/span&gt;, 
                &lt;span class="s2"&gt;"EndpointID"&lt;/span&gt;: &lt;span class="s2"&gt;"5b86698bc46027072001506a1cd"&lt;/span&gt;,
                &lt;span class="s2"&gt;"MacAddress"&lt;/span&gt;: &lt;span class="s2"&gt;"02:42:ac:14:00:04"&lt;/span&gt;, &lt;span class="c"&gt;# Mac address allocated to the network interface of a container.&lt;/span&gt;
                &lt;span class="s2"&gt;"IPv4Address"&lt;/span&gt;: &lt;span class="s2"&gt;"172.20.0.4/16"&lt;/span&gt;, &lt;span class="c"&gt;# IPv4 address allocated to a container.&lt;/span&gt;
                &lt;span class="s2"&gt;"IPv6Address"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"Options"&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;,
        &lt;span class="s2"&gt;"Labels"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"com.docker.compose.network"&lt;/span&gt;: &lt;span class="s2"&gt;"default"&lt;/span&gt;, 
            &lt;span class="s2"&gt;"com.docker.compose.project"&lt;/span&gt;: &lt;span class="s2"&gt;"hyunphoto-fbv"&lt;/span&gt;, &lt;span class="c"&gt;# Docker compose project name to which this network belongs.&lt;/span&gt;
            &lt;span class="s2"&gt;"com.docker.compose.version"&lt;/span&gt;: &lt;span class="s2"&gt;"2.29.2"&lt;/span&gt; &lt;span class="c"&gt;# Docker Compose version that created the network.&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I know the container that I have to stop.&lt;br&gt;
Solution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop hyunphoto-fbv-proxy-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I can see there is no a container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apple@GH-MacBook-Pro hyunphoto-fbv % docker network inspect hyunphoto-fbv_default

&lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"Name"&lt;/span&gt;: &lt;span class="s2"&gt;"hyunphoto-fbv_default"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Id"&lt;/span&gt;: &lt;span class="s2"&gt;"eee2041694529e233c352c6e3140aee457c6a33b468b92a33327fd1d39dff5bf"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Created"&lt;/span&gt;: &lt;span class="s2"&gt;"2024-11-15T14:15:07.24638069Z"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Scope"&lt;/span&gt;: &lt;span class="s2"&gt;"local"&lt;/span&gt;,
        &lt;span class="s2"&gt;"Driver"&lt;/span&gt;: &lt;span class="s2"&gt;"bridge"&lt;/span&gt;,
        &lt;span class="s2"&gt;"EnableIPv6"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"IPAM"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"Driver"&lt;/span&gt;: &lt;span class="s2"&gt;"default"&lt;/span&gt;,
            &lt;span class="s2"&gt;"Options"&lt;/span&gt;: null,
            &lt;span class="s2"&gt;"Config"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
                &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;"Subnet"&lt;/span&gt;: &lt;span class="s2"&gt;"172.20.0.0/16"&lt;/span&gt;,
                    &lt;span class="s2"&gt;"Gateway"&lt;/span&gt;: &lt;span class="s2"&gt;"172.20.0.1"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;]&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"Internal"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"Attachable"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"Ingress"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"ConfigFrom"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"Network"&lt;/span&gt;: &lt;span class="s2"&gt;""&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"ConfigOnly"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"Containers"&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;, &lt;span class="c"&gt;# HERE!&lt;/span&gt;
        &lt;span class="s2"&gt;"Options"&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;,
        &lt;span class="s2"&gt;"Labels"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="s2"&gt;"com.docker.compose.network"&lt;/span&gt;: &lt;span class="s2"&gt;"default"&lt;/span&gt;,
            &lt;span class="s2"&gt;"com.docker.compose.project"&lt;/span&gt;: &lt;span class="s2"&gt;"hyunphoto-fbv"&lt;/span&gt;,
            &lt;span class="s2"&gt;"com.docker.compose.version"&lt;/span&gt;: &lt;span class="s2"&gt;"2.29.2"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>webdev</category>
      <category>network</category>
    </item>
    <item>
      <title>Reflection on Using TDD (Test Driven Development)</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Mon, 25 Nov 2024 16:12:36 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/reflection-on-using-tdd-test-driven-development-2621</link>
      <guid>https://forem.com/hyun_hyun/reflection-on-using-tdd-test-driven-development-2621</guid>
      <description>&lt;p&gt;When creating an API, if the input and output are not clearly defined, confusion can arise during the development process. This is why writing an API document is important, and I believe TDD is a technical version of the document.&lt;/p&gt;

&lt;p&gt;At first, I questioned why we needed to write unit tests when the API documentation was already available. However, after applying TDD, I realized how effective this approach is.&lt;/p&gt;

&lt;p&gt;Development is the process of building a system based on the plans we've created. Through TDD, I realized that it allows us to implement features more efficiently by sticking to the structure of the plan. Rather than developing all features first and then running tests to fix errors, writing tests upfront and addressing errors one by one as we develop the features saves both time and addressing errors one by one as we develop the features saves both time and energy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Develop API -&amp;gt; Test -&amp;gt; Find Error! -&amp;gt; Fix -&amp;gt; ...&lt;/li&gt;
&lt;li&gt;Test -&amp;gt; Find Error!(no API, no model... things haven't been developed yet...) -&amp;gt; Fix it(create Model, API...install...) -&amp;gt; ...&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I think TDD is a technique for minimizing mistakes and staying on track throughout the development process.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Error response from daemon: driver failed programming external connectivity on endpoint</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Fri, 15 Nov 2024 13:44:14 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/error-response-from-daemon-driver-failed-programming-external-connectivity-on-endpoint-407b</link>
      <guid>https://forem.com/hyun_hyun/error-response-from-daemon-driver-failed-programming-external-connectivity-on-endpoint-407b</guid>
      <description>&lt;p&gt;I just tried to open the page with &lt;code&gt;docker compose up&lt;/code&gt;,&lt;br&gt;
And I got an error message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Error response from daemon: driver failed programming external connectivity on endpoint hyunphoto-fbv-app-1 &lt;span class="o"&gt;(&lt;/span&gt;docker container ID&lt;span class="o"&gt;)&lt;/span&gt;: Bind &lt;span class="k"&gt;for &lt;/span&gt;0.0.0.0:8000 failed: port is already allocated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran another project on docker &amp;amp; AWS EC2, and 'already' word is led me check docker container list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apple@GH-MacBook-Pro recipe-app-api % docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;+] Running 1/0
 &lt;span class="o"&gt;!&lt;/span&gt; Network recipe-app-api_default  Resource is still &lt;span class="k"&gt;in &lt;/span&gt;use                                              0.0s 
apple@GH-MacBook-Pro recipe-app-api % docker network &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and I saw one thing is suspicious.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS                        PORTS     NAMES
container_id   recipe-app-api-proxy              &lt;span class="s2"&gt;"/docker-entrypoint.…"&lt;/span&gt;   29 hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If STATUS is 29 hours ago, it means the container doesn't work. but 29 hours means still works.&lt;/p&gt;

&lt;p&gt;Let's stop it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop container_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, I'll re-run &lt;code&gt;docker compose up&lt;/code&gt; where we want to run. &lt;br&gt;
It works very well. &lt;/p&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Simple things to design URL</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Mon, 11 Nov 2024 14:31:38 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/simple-things-to-design-url-4ho6</link>
      <guid>https://forem.com/hyun_hyun/simple-things-to-design-url-4ho6</guid>
      <description>&lt;h1&gt;
  
  
  How to design URL?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;URLs should include nouns, not verbs.&lt;/li&gt;
&lt;li&gt;User plural nouns only for consistency (no singular nouns).&lt;/li&gt;
&lt;li&gt;Use HTTP methods (HTTP/1.1) to operate on these resources:&lt;/li&gt;
&lt;li&gt;Use HTTP response status codes to represent the outcome of operations on resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  URI normalization
&lt;/h1&gt;

&lt;p&gt;To transform a URI into a normalized URI have a Goal:&lt;br&gt;&lt;br&gt;
The normalization is possible to determine if two syntactically different URIs may be equivalent.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Converting percent-encoded triplets to uppercase.&lt;br&gt;&lt;br&gt;
&lt;a href="http://example.com/foo%2a" rel="noopener noreferrer"&gt;http://example.com/foo%2a&lt;/a&gt; → &lt;a href="http://example.com/foo%2A" rel="noopener noreferrer"&gt;http://example.com/foo%2A&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Converting the scheme and host to lowercase.&lt;br&gt;&lt;br&gt;
&lt;a href="HTTP://User@Example.COM/Foo"&gt;HTTP://User@Example.COM/Foo&lt;/a&gt; → &lt;a href="http://User@example.com/Foo" rel="noopener noreferrer"&gt;http://User@example.com/Foo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decoding percent-encoded triplets of unreserved characters. Percent-encoded triplets of the URI in the range of ALPHA, DIGIT, hyphen, period, underscore, or tilde ... should be decoded ...&lt;br&gt;&lt;br&gt;
&lt;a href="http://example.com/%7Efoo" rel="noopener noreferrer"&gt;http://example.com/%7Efoo&lt;/a&gt; → &lt;a href="http://example.com/%7Efoo" rel="noopener noreferrer"&gt;http://example.com/~foo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removing dot-segment.&lt;br&gt;&lt;br&gt;
&lt;a href="http://example.com/foo/./bar/baz/../qux" rel="noopener noreferrer"&gt;http://example.com/foo/./bar/baz/../qux&lt;/a&gt; → &lt;a href="http://example.com/foo/bar/qux" rel="noopener noreferrer"&gt;http://example.com/foo/bar/qux&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Converting an empty path to a "/" path.&lt;br&gt;&lt;br&gt;
&lt;a href="http://example.com" rel="noopener noreferrer"&gt;http://example.com&lt;/a&gt; → &lt;a href="http://example.com/" rel="noopener noreferrer"&gt;http://example.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removing the default port.&lt;br&gt;&lt;br&gt;
&lt;a href="http://example.com:80/" rel="noopener noreferrer"&gt;http://example.com:80/&lt;/a&gt; → &lt;a href="http://example.com/" rel="noopener noreferrer"&gt;http://example.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Reference [&lt;a href="'https://apiguide.readthedocs.io/en/latest/build_and_publish/use_RESTful_urls.html'"&gt;HTTP: The Definitive Guide&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>If you want to analyze simply, use ProfileReport</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Wed, 30 Oct 2024 05:52:15 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/if-you-want-to-analyze-simply-use-profilereport-3f6d</link>
      <guid>https://forem.com/hyun_hyun/if-you-want-to-analyze-simply-use-profilereport-3f6d</guid>
      <description>&lt;p&gt;If you don't know how to analyze with code or don't have a time, you can simply use &lt;code&gt;ProfileReport&lt;/code&gt; library.&lt;/p&gt;

&lt;p&gt;The steps is very simple too.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install&lt;br&gt;
pip install ydata-profiling&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import and use it&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ydata_profiling&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ProfileReport&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.csv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ProfileReport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Data analysis&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Data_report.html&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will be stored as 'Data_report.html'.&lt;/p&gt;

&lt;p&gt;It automatically report these things.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Information of the data&lt;/li&gt;
&lt;li&gt;Type of the variable&lt;/li&gt;
&lt;li&gt;Count None value&lt;/li&gt;
&lt;li&gt;Descriptive statistic of the variables&lt;/li&gt;
&lt;li&gt;Correlation each of the variables&lt;/li&gt;
&lt;li&gt;Visualization of the analysis (auto adjusted type of graph)&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was very helpful to write a report quickly.&lt;/p&gt;

</description>
      <category>python</category>
      <category>statistic</category>
      <category>profilereport</category>
    </item>
    <item>
      <title>Understanding Response Status Codes in Django REST Framework</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Thu, 24 Oct 2024 10:54:22 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/understanding-response-status-codes-in-django-rest-framework-2o3n</link>
      <guid>https://forem.com/hyun_hyun/understanding-response-status-codes-in-django-rest-framework-2o3n</guid>
      <description>&lt;p&gt;When returning a response with data, you can omit the status parameter name if you're using HTTP_200_OK.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTP_200_OK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, when returning a response without data, simply passing the status code without the parameter name won't work as expected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTP_204_NO_CONTENT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You must explicitly specify the status parameter name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTP_204_NO_CONTENT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>django</category>
      <category>statuscodes</category>
    </item>
    <item>
      <title>unittest with get_user_model()</title>
      <dc:creator>Gahyun Son</dc:creator>
      <pubDate>Wed, 23 Oct 2024 11:18:16 +0000</pubDate>
      <link>https://forem.com/hyun_hyun/unittest-with-getusermodel-e98</link>
      <guid>https://forem.com/hyun_hyun/unittest-with-getusermodel-e98</guid>
      <description>&lt;h2&gt;
  
  
  1. Custom User model
&lt;/h2&gt;

&lt;p&gt;In Django, you can override the user model provided by Django.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AbstractUser. 2. AbstractBaseUser.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I chose AbstractBaseUser. Below code is a my custom user.&lt;/p&gt;

&lt;p&gt;I defined in /djangoproject/app/core/models.py&lt;br&gt;
(I'm going to write all models on this file.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib.auth.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;AbstractBaseUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;BaseUserManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;PermissionsMixin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AbstractBaseUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PermissionsMixin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EmailField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;address2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;nation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;postal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BooleanField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;is_staff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BooleanField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UserManager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;USERNAME_FIELD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I made UserManager too, but I haven't included it here for brevity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Setting AUTH_USER_MODEL in settings.py
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;AUTH_USER_MODEL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;core.user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add it to settings.py. The value is a my custom user model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating unittest a file. /djangoproject/app/core/tests/test_model.py
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelTests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_create_user_with_email_successful&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test@example.com&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;test123test&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_model&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I checked whether the email is correctly saved in the database and whether the password is properly validated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are two ways to reference the custom user model. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Direct import user model.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;

&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, but if the AUTH_USER_MODEL setting is later changed to a different user model, you'll need to update all instances to the changed model.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import get_user_model().
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.contrib.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_user_model&lt;/span&gt;

&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_model&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;get_user_model returns the currently active user model. It will work without requiring code modifications.&lt;/p&gt;

</description>
      <category>django</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>unittest</category>
    </item>
  </channel>
</rss>
