質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1808閲覧

2つのモデルのreturn部分の記述が異なるのでその理由を教えていただけませんか?

kotatsu2

総合スコア16

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/12/31 10:29

pythonでプログラムの勉強を始めてまだ2週間目の超プログラム初心者です。
Djangoで学生のレッスン記録システムを作りたくて試行錯誤しています。

今、Models.pyの作成をしていますが、Studentモデルは「return self.name」とすると、adminページから「Student」としてデータを追加、修正、削除ができますが、Scheduleモデルは「return str(self.student)」としてstrに変換しないと、adminページでデータの追加、修正、削除ができません。

記述方法に大して違いがないのに、どうしてreturnの書き方を変えないといけないのかわかりません。

StudentモデルからScheduleにStudentのnameをForeignKeyで結んでいるからでしょうか?
まだ、pythonも勉強中でよくわかっていませんが、よろしくお願いします。

【開発環境】
Python = 3.7.1
Djando = 2.1.4

class Student(models.Model): name = models.CharField(_('student name'), max_length=30, blank=False) skype = models.CharField(_('skype'), max_length=50, blank=True) country = models.CharField(_('country'), max_length=50, blank=True) steady = models.ForeignKey(Steady, on_delete=models.SET_NULL, null=True) created_at = models.DateTimeField(default=timezone.now) updated_at = models.DateTimeField(default=timezone.now) class Meta: db_table = 'student' def __str__(self): return self.name
class Schedule(models.Model): student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="student") lesson_date = models.DateField(blank=False) article = models.CharField(_('article'), max_length=225, blank=True) content = models.TextField(_('content'), blank=True) created_at = models.DateTimeField(default=timezone.now) updated_at = models.DateTimeField(default=timezone.now) def __str__(self): return str(self.student) class Meta: db_table = 'schedule'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

大前提として、メソッド __str__() の戻り値は str 型である必要があります。その上で……

  • Student クラスでは、インスタンスの name アトリビュートにアクセスすると str 型が返されます。そのため、 __str__() メソッドの戻り値に直接 self.name を渡すことができます。
  • 他方 Schedule クラスの場合は、インスタンスの student アトリビュートにアクセスすると、そのインスタンスに紐付けられた Student インスタンスが返されます。これは str 型ではないので、そのまま __str__() の戻り値にしてはいけません。そのため str()str 型に変換してから返す(つまり return str(self.student) と書く)ことになります。

結果として、 StudentSchedule の書き方が変わる形になる、のではないかと思います。ただ、 Student の方を return str(self.name) と書いてはいけない理由は無いので、形を揃えたければそう書いてもよいのではないでしょうか。

追加の疑問点が出てきた場合は、こちらですべてを伝え切るのは大変なので基本的なものはご自身で検索して調べていただければと思いますが、どうしてもわからない部分がありましたらコメントでお知らせください :)

投稿2019/01/01 09:49

gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotatsu2

2019/01/01 13:12

gh640さん、解答ありがとうございます。studentのForeignKeyの部分をCharFieldに書き換えて確認したところ、数字が入っていたので恐らくint型にデータが変わっているようです。だからstr型に変換しなければいけなかったんですね。よくわかりました。ありがとうございました。
gh640

2019/01/03 07:35

ご解決されたようでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問