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

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

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

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

Python

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

Q&A

解決済

1回答

2728閲覧

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

ktg_st

総合スコア33

Django

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

Python

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

0グッド

0クリップ

投稿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

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

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

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

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

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

ForestSeo

2020/06/02 22:06

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

回答1

0

ベストアンサー

Python

1Shop_name.objects.get(pk=1).user 2```これでpk1のshopのuserが出るのでは?

投稿2020/06/02 22:07

ForestSeo

総合スコア2720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問