Django:我应该如何为此构建模型?

时间:2018-02-06 12:02:46

标签: python django django-models

更新

我制作了这些新模型。

class Day(models.Model):
     day = models.CharField(max_length=20)


class Shift(models.Model):
    shift = models.CharField(max_length=20)
    days = models.ManyToManyField(Day, through='DayShift', related_name='day_shift')


class DayShift(models.Model):
    time = models.TimeField()
    day = models.ForeignKey(Day, related_name='to_day')
    shift = models.ForeignKey(Shift, related_name='to_shift')
    clinics_doctors = models.ManyToManyField(ClinicDoctor, through='ClinicDoctorDayShift', related_name='clinicDoctor_dayShift')

class ClinicDoctorDayShift(models.Model):
    clinic_doctor = models.ForeignKey(ClinicDoctor, related_name='to_clinicDoctor')
    day_shift = models.ForeignKey(DayShift, related_name='to_dayShift')

原始问题

我正在努力建立我的第一个网站。我正在使用Django。

我现在有这些模型与我有疑问相关:

class Clinic(models.Model):
    name = models.CharField(max_length=100)

    DOC_DAYS_CHOICES = (
       'Sunday',
       'Monday',
       'Tuesday',
       'Wednesday',
       'Thursday',
       'Friday',
       'Saturday'
    )

   DOC_DAYS_SHIFTS = (
      'Morning',
      'Afternoon',
      'Evening'
   )

class ClinicDoctor(models.Model):
   doctor = models.ForeignKey('User', related_name='doctorsF') 
   clinic = models.ForeignKey(Clinic, related_name='clinicsF')
   days = models.CharField(max_length=200)  
   time = models.TimeField()
   shift = models.CharField(max_length=15)

我坚持这件事。我一直在修改模型。现在我不知道如何实现我想要的。我附上了两张照片。一个显示我的数据将如何,另一个显示我希望它如何显示在页面上。

我想构建模型,以便代码高效,我想要显示的内容应该DB点击perfetch我可以用@interface YourClassViewController (){ NSObject * periodicPlayerTimeObserverHandle; } @property (nonatomic, strong) AVPlayer *player; @property (nonatomic, strong) UIProgressView *progressView; -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; if(_player != nil && ![self isPlaying]) { [self musicPlay]; } } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (_player != nil) { [self stopPlaying]; } } // ---------- // PLAYER // ---------- -(BOOL) isPlaying { return ([_player rate] > 0); } -(void) musicPlay { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:[_player currentItem]]; __weak typeof(self) weakSelf = self; periodicPlayerTimeObserverHandle = [_player addPeriodicTimeObserverForInterval:CMTimeMakeWithSeconds(1.0 / 60.0, NSEC_PER_SEC) queue:NULL usingBlock:^(CMTime time){ [weakSelf updateProgressBar]; }]; [_player play]; } -(void) stopPlaying { @try { if(periodicPlayerTimeObserverHandle != nil) { [_player removeTimeObserver:periodicPlayerTimeObserverHandle]; periodicPlayerTimeObserverHandle = nil; } [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:nil]; [_player pause]; } @catch (NSException * __unused exception) {} } -(void) playPreviewSong:(NSURL *) previewSongURL { [self configureAVPlayerAndPlay:previewSongURL]; } -(void) configureAVPlayerAndPlay: (NSURL*) url { if(_player) [self stopPlaying]; AVAsset *audioFileAsset = [AVURLAsset URLAssetWithURL:url options:nil]; AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:audioFileAsset]; _player = [AVPlayer playerWithPlayerItem:playerItem]; [_player addObserver:self forKeyPath:@"status" options:0 context:nil]; CRLPerformBlockOnMainThreadAfterDelay(^{ NSError *loadErr; if([audioFileAsset statusOfValueForKey:@"playable" error:&loadErr] == AVKeyValueStatusLoading) { [audioFileAsset cancelLoading]; [self stopPlaying]; [self showNetworkError:NSLocalizedString(@"Could not play file",nil)]; } }, NETWORK_REQUEST_TIMEOUT); } - (void)updateProgressBar { double currentTime = CMTimeGetSeconds(_player.currentTime); if(currentTime <= 0.05){ [_progressView setProgress:(float)(0.0) animated:NO]; return; } if (isfinite(currentTime) && (currentTime > 0)) { float maxValue = CMTimeGetSeconds(_player.currentItem.asset.duration); [_progressView setProgress:(float)(currentTime/maxValue) animated:YES]; } } -(void) showNetworkError:(NSString*)errorMessage { UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"No connection", nil) message:errorMessage preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { // do nothing }]]; [self presentViewController:alert animated:YES completion:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == _player && [keyPath isEqualToString:@"status"]) { if (_player.status == AVPlayerStatusFailed) { [self showNetworkError:NSLocalizedString(@"Could not play file", nil)]; } else if (_player.status == AVPlayerStatusReadyToPlay) { NSLog(@"AVPlayerStatusReadyToPlay"); [TLAppAudioAccess setAudioAccess:TLAppAudioAccessType_Playback]; [self musicPlay]; } else if (_player.status == AVPlayerItemStatusUnknown) { NSLog(@"AVPlayerItemStatusUnknown"); } } } - (void)playerItemDidReachEnd:(NSNotification *)notification { if ([notification.object isEqual:self.player.currentItem]) { [self.player seekToTime:kCMTimeZero]; [self.player play]; } } -(void) dealloc{ @try { [_player removeObserver:self forKeyPath:@"status"]; } @catch (NSException * __unused exception) {} [self stopPlaying]; _player = nil; } 获得的任何内容?

Structure image Page dispaly

如图所示。每位医生都有多个诊所。然后每周7天,每个诊所每天可以换班3次。

1 个答案:

答案 0 :(得分:0)

尝试为DOC_DAYS_CHOICES & DOC_DAYS_SHIFTS创建一个表,因为每次需要匹配字符串时,您都可以使用此下拉菜单来匹配ID。您可以轻松地在ClinicDoctor table中维护关系。这不是完美的解决方案,而是使用它的建议。