Подводя итог, прежде чем я перейду к плохим примерам и т. д.: я пытаюсь создать приложение, в котором мне не нужно писать код во всех моих моделях, чтобы ограничить выбор текущей учетной записью, вошедшей в систему (я не использую Аутентификация или встроенные функции для учетной записи или входа).
то есть я не хочу делать что-то вроде этого:
class Ticket(models.Model):
account = models.ForeignKey(Account)
client = models.ForeignKey(Client) # A client will be owned by one account.
content = models.CharField(max_length=255)
class TicketForm(forms.ModelForm):
class Meta:
model = Ticket
exclude = ('account',) #First sign of bad design?
def __init__(self, *args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
if self.initial.get('account'):
# Here's where it gets ugly IMHO. This seems almost
# as bad as hard coding data. It's not DRY either.
self.fields['client'].queryset = Client.objects.filter(account=self.initial.get('account'))
Моя идея состоит в том, чтобы создать модель Account(models.Model)
со следующим пользовательским менеджером и создать подкласс, используя многотабличное наследование со всеми моими моделями. Хотя это вызывает у меня сильную головную боль. Нужен ли мне внешний ключ account
для каждой модели? Могу ли я получить доступ к учетной записи родительского класса для определенного экземпляра модели?
class TicketManager(models.Manager):
def get_query_set(self):
return super(TicketManager, self).get_query_set().filter(account=Account.objects.get(id=1))
# Obviously I don't want to hard code the account like this.
# I want to do something like this:
# return super(ProductManager, self).get_query_set().filter(account=self.account)
# Self being the current model that's using this manager
# (obviously this is wrong because you're not inside a model
# instance , but this is where the confusion comes in for me.
# How would I do this?).
Пожалуйста, игнорируйте любые вопиющие синтаксические ошибки. Я напечатал все это здесь.
Вот где у меня появилась идея сделать это: Django Проект пространства имен