Django change BooleanField value after DateField expires
I would like to be able to automatically set suspended to False (if is True, of course) when end_suspension_date passes by (and therefore if it exists).
models.py
class Profile(models.Model):
suspended = models.BooleanField(default=False)
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
Is there any way to do this without third-party apps? I thought of defining a function inside the model (but I don't see much sense in doing so):
def end_suspension(self):
if date.today() >= self.end_suspension_date:
self.suspended = False
start_suspension_date = None
end_suspension_date = None
else:
# do nothing...
django python-3.6
add a comment |
I would like to be able to automatically set suspended to False (if is True, of course) when end_suspension_date passes by (and therefore if it exists).
models.py
class Profile(models.Model):
suspended = models.BooleanField(default=False)
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
Is there any way to do this without third-party apps? I thought of defining a function inside the model (but I don't see much sense in doing so):
def end_suspension(self):
if date.today() >= self.end_suspension_date:
self.suspended = False
start_suspension_date = None
end_suspension_date = None
else:
# do nothing...
django python-3.6
add a comment |
I would like to be able to automatically set suspended to False (if is True, of course) when end_suspension_date passes by (and therefore if it exists).
models.py
class Profile(models.Model):
suspended = models.BooleanField(default=False)
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
Is there any way to do this without third-party apps? I thought of defining a function inside the model (but I don't see much sense in doing so):
def end_suspension(self):
if date.today() >= self.end_suspension_date:
self.suspended = False
start_suspension_date = None
end_suspension_date = None
else:
# do nothing...
django python-3.6
I would like to be able to automatically set suspended to False (if is True, of course) when end_suspension_date passes by (and therefore if it exists).
models.py
class Profile(models.Model):
suspended = models.BooleanField(default=False)
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
Is there any way to do this without third-party apps? I thought of defining a function inside the model (but I don't see much sense in doing so):
def end_suspension(self):
if date.today() >= self.end_suspension_date:
self.suspended = False
start_suspension_date = None
end_suspension_date = None
else:
# do nothing...
django python-3.6
django python-3.6
asked Nov 12 '18 at 22:58
gccalliegccallie
246
246
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
No, you will need something like celery to define a task that filters for end of suspension.
An alternative method I prefer is to replace the suspended
field with a property, because having a field that stores "is the user suspended" and a field that stores "when is the user no longer suspended" are redundant because we know the current date.
A more idiomatic would be calling it is_suspended
, so:
class Profile(models.Model):
...
@property
def is_suspended(self):
return date.today() < self.end_suspension_date
Then on login views permission checks etc just access profile.is_suspended
.
Simple is better then complex :)
Aldi, beware of timezone. Rule of thumb: store UTC date instead of local date.
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
add a comment |
You can try it, like:
class Profile(models.Model):
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
@property
def suspended(self):
return date.today() < self.end_suspension_date
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53271326%2fdjango-change-booleanfield-value-after-datefield-expires%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
No, you will need something like celery to define a task that filters for end of suspension.
An alternative method I prefer is to replace the suspended
field with a property, because having a field that stores "is the user suspended" and a field that stores "when is the user no longer suspended" are redundant because we know the current date.
A more idiomatic would be calling it is_suspended
, so:
class Profile(models.Model):
...
@property
def is_suspended(self):
return date.today() < self.end_suspension_date
Then on login views permission checks etc just access profile.is_suspended
.
Simple is better then complex :)
Aldi, beware of timezone. Rule of thumb: store UTC date instead of local date.
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
add a comment |
No, you will need something like celery to define a task that filters for end of suspension.
An alternative method I prefer is to replace the suspended
field with a property, because having a field that stores "is the user suspended" and a field that stores "when is the user no longer suspended" are redundant because we know the current date.
A more idiomatic would be calling it is_suspended
, so:
class Profile(models.Model):
...
@property
def is_suspended(self):
return date.today() < self.end_suspension_date
Then on login views permission checks etc just access profile.is_suspended
.
Simple is better then complex :)
Aldi, beware of timezone. Rule of thumb: store UTC date instead of local date.
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
add a comment |
No, you will need something like celery to define a task that filters for end of suspension.
An alternative method I prefer is to replace the suspended
field with a property, because having a field that stores "is the user suspended" and a field that stores "when is the user no longer suspended" are redundant because we know the current date.
A more idiomatic would be calling it is_suspended
, so:
class Profile(models.Model):
...
@property
def is_suspended(self):
return date.today() < self.end_suspension_date
Then on login views permission checks etc just access profile.is_suspended
.
Simple is better then complex :)
Aldi, beware of timezone. Rule of thumb: store UTC date instead of local date.
No, you will need something like celery to define a task that filters for end of suspension.
An alternative method I prefer is to replace the suspended
field with a property, because having a field that stores "is the user suspended" and a field that stores "when is the user no longer suspended" are redundant because we know the current date.
A more idiomatic would be calling it is_suspended
, so:
class Profile(models.Model):
...
@property
def is_suspended(self):
return date.today() < self.end_suspension_date
Then on login views permission checks etc just access profile.is_suspended
.
Simple is better then complex :)
Aldi, beware of timezone. Rule of thumb: store UTC date instead of local date.
answered Nov 12 '18 at 23:28
rikAteerikAtee
4,82542958
4,82542958
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
add a comment |
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
The side effect is that in my app profiles don't need a login, so if I check profile.is_suspended everytime I refresh the page it will add a lot of load time (if I have for example many Profile entries)
– gccallie
Nov 12 '18 at 23:43
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
In terms of database reads there is no difference between the two solutions: if a Boolean field was used you would still need to hit the database to check if it was true or false🙃
– rikAtee
Nov 12 '18 at 23:47
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
maybe I could set a control that call is_suspended() just once a day... Also thanks for the UTC suggestion, I'll check out how (if I can do i) to do it and update the post.
– gccallie
Nov 12 '18 at 23:52
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
Candidly, I think you're overthinking it and are on the cusp of premature optimization. Start with the property and optimize it later if you see performance problems. Pro tip: you won't see performance problems here. Focus your time and effort on what matters.
– rikAtee
Nov 13 '18 at 0:17
add a comment |
You can try it, like:
class Profile(models.Model):
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
@property
def suspended(self):
return date.today() < self.end_suspension_date
add a comment |
You can try it, like:
class Profile(models.Model):
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
@property
def suspended(self):
return date.today() < self.end_suspension_date
add a comment |
You can try it, like:
class Profile(models.Model):
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
@property
def suspended(self):
return date.today() < self.end_suspension_date
You can try it, like:
class Profile(models.Model):
start_suspension_date = models.DateField(null=True, blank=True)
end_suspension_date = models.DateField(null=True, blank=True)
# ... other fields
@property
def suspended(self):
return date.today() < self.end_suspension_date
answered Nov 12 '18 at 23:26
padenypadeny
463
463
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53271326%2fdjango-change-booleanfield-value-after-datefield-expires%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown