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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

djangoの外部キーをpkとして取得してデータを取得したい

ktg_st
ktg_st

総合スコア33

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0リアクション

0クリップ

1677閲覧

投稿2020/06/02 13:30

編集2020/06/02 13:35

https://teratail.com/questions/266869
↑の続きです、解決したと思ったらしてませんでした。

やりたいこと
店舗(shop)ごとにscheduleを表示させたい

pkを使ってクエリセットを取得しようとしましたが、上手く行かず、[shop_pk]で書きましたがエラーにはなりませんでしたが、出力結果はpk=user.idになっているようで思っているような結果にはなりませんでした。(pk=1の時user.pkが1のuserが表示される。)

shop.pkが1の店舗のユーザーが全員表示されることを期待しましたが無理でした。

説明不足の部分もあると思うので何かコメント頂ければ追記します!
何かアドバイス頂けると助かります。

models.py class Schedule(models.Model): """スケジュール""" user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='ユーザー', on_delete=models.SET_NULL, blank=True, null=True,related_name = "user_schedule") start_time = models.CharField('開始時間', choices= SUB_START, max_length=50,blank=True,default="0") end_time = models.CharField('終了時間', choices= SUB_END, max_length=50,blank=True,default="0") date = models.DateField('日付') shop = models.ForeignKey(Shops, verbose_name='店舗', on_delete=models.CASCADE,blank=True,related_name = "shop_schedule") objects = DataFrameManager() def __int__(self): return self.date
forms.py class SimpleScheduleForm(forms.ModelForm): """シンプルなスケジュール登録用フォーム""" class Meta: model = Schedule fields = ('start_time', 'end_time', 'date') widgets = { 'date': forms.HiddenInput, 'shop':forms.HiddenInput, }
mixin.py class ShopShiftWithScheduleMixin(WeekCalendarMixin): def get_week_schedules(self, start, end, days): lookup = { '{}__range'.format(self.date_field): (start, end), 'shop__pk': self.kwargs.get('shop_pk'), } queryset = self.model.objects.filter(**lookup) days = {day: [] for day in days} df = pd.DataFrame(days) a=1 for schedule in queryset: if a == 1: user=schedule.user.last_name+' '+schedule.user.first_name date= schedule.date start_time=schedule.get_start_time_display() end_time = schedule.get_end_time_display() time = start_time+'-'+end_time ddf =pd.DataFrame({date:time},index =[user]) df = pd.concat([df,ddf],axis=0) df.fillna(" ", inplace=True) a = 2 if user != schedule.user.last_name+' '+schedule.user.first_name: user=schedule.user.last_name+' '+schedule.user.first_name date= schedule.date start_time=schedule.get_start_time_display() end_time = schedule.get_end_time_display() time = start_time+'-'+end_time ddf =pd.DataFrame({date:time},index =[user]) df = pd.concat([df,ddf],axis=0) df.fillna(" ", inplace=True) else: user=schedule.user.last_name+' '+schedule.user.first_name date= schedule.date start_time=schedule.get_start_time_display() end_time = schedule.get_end_time_display() time = start_time+'-'+end_time ddf =pd.DataFrame({date:time},index =[user]) df[date]= df[date].astype(str) df.at[user,date] =time df.fillna(" ", inplace=True) df.fillna(" ", inplace=True) return df def get_week_calendar(self): calendar_context = super().get_week_calendar() calendar_context['df'] = self.get_week_schedules( calendar_context['week_first'], calendar_context['week_last'], calendar_context['week_days'] ) return calendar_context class WeekCalendarMixin(BaseCalendarMixin): def get_previous_week(self, date): """前月を返す""" if date.month == 1 and date.day ==16: return date.replace(year=date.year-1, month=12,day=16) if date.month == 1 and date.day ==1: return date.replace(year=date.year-1, month=12,day=1) if date.day == 16: return date.replace(month =date.month -1 ,day = 16) if date.day == 1: return date.replace(month =date.month -1 ,day = 1) def get_week_days(self): """その週の日を全て返す""" month = self.kwargs.get('month') year = self.kwargs.get('year') day = self.kwargs.get('day') if month and year and day: date = datetime.date(year=int(year), month=int(month), day=int(day)) if date.month ==12 and date.day >10: month = 1 year = date.year +1 dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(1)) dtlist = [date + datetime.timedelta(days =day) for day in range(0,15)] return dtlist if date.month ==1 and date.day ==1: month =12 year = date.year-1 dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(15)) dtlist = [date + datetime.timedelta(days =day) for day in range(1,dtm-14)] return dtlist if date.month != 12 and date.day < 21 and date.day > 4: dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month+1),day = int(1)) dtlist = [date + datetime.timedelta(days =day) for day in range(0,15)] return dtlist if date.day < 6: dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(15)) dtlist = [date + datetime.timedelta(days =day) for day in range(1,dtm-14)] return dtlist if date.day > 20: month =month-1 dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(15)) dtlist = [date + datetime.timedelta(days =day) for day in range(1,dtm-14)] return dtlist else: date = datetime.date.today() year =int(date.year) month=int(date.month) day=int(date.day) if date.day < 21 and date.day > 5: date = datetime.date(year = int(year),month=int(month+1),day = int(1)) dtlist = [date + datetime.timedelta(days =day) for day in range(0,15)] return dtlist if date.day < 6: dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(15)) dtlist = [date + datetime.timedelta(days =day) for day in range(1,dtm-14)] return dtlist if date.day > 20: month = month + 1 dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(15)) dtlist = [date + datetime.timedelta(days =day) for day in range(1,dtm-14)] return dtlist if date.month ==12 and date.day < 21 and date.day > 5: month = 1 year = date.year +1 dtm = calendar.monthrange(year,month)[1] date = datetime.date(year = int(year),month=int(month),day = int(1)) dtlist = [date + datetime.timedelta(days =day) for day in range(0,15)] return dtlist def name(self): weekname=['月','火','水','木','金','土','日'] name=[] week=[] day = self.get_week_days() for l in day: name.append(l.weekday()) for nn in name: week.append(weekname[nn]) return week def get_week_calendar(self): self.setup_calendar() days = self.get_week_days() first = days[0] last = days[-1] ago = self.get_previous_week(first) calendar_data = { 'now': datetime.date.today(), 'week_days': days, 'week_previous': ago, 'week_next': first , 'week_names': self.name(), 'week_first': first, 'week_last': last, } return calendar_data
views.py class ShiftList(mixins.ShiftWithScheduleMixin, generic.ListView): """すべてのユーザースケジュールの一覧""" model = Schedule template_name = 'app/shift_list.html' date_field = 'date' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) calendar_context = self.get_week_calendar() context.update(calendar_context) return context class ShopShiftList(mixins.ShopShiftWithScheduleMixin, generic.TemplateView): """店舗ごとのユーザースケジュール一覧""" model = Schedule template_name = 'app/shopshift_list.html' date_field = 'date' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) shop = get_object_or_404(Shops, pk=self.kwargs['shop_pk']) context['shop']= self.model.objects.filter(shop=shop) calendar_context = self.get_week_calendar() context.update(calendar_context) return context

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

ForestSeo

2020/06/02 22:06

shopのmodelってshop_nameでしたっけ?

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。