更新
我制作了这些新模型。
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;
}
获得的任何内容?
如图所示。每位医生都有多个诊所。然后每周7天,每个诊所每天可以换班3次。
答案 0 :(得分:0)
尝试为DOC_DAYS_CHOICES & DOC_DAYS_SHIFTS
创建一个表,因为每次需要匹配字符串时,您都可以使用此下拉菜单来匹配ID。您可以轻松地在ClinicDoctor table
中维护关系。这不是完美的解决方案,而是使用它的建议。