Метод ModelAdmin останавливается, когда я ссылаюсь слишком глубоко - PullRequest
0 голосов
/ 11 апреля 2020

В моей модели есть несколько сайтов, каждый из которых ссылается на набор адресов электронной почты. Электронное письмо должно быть отправлено на адрес email_address каждого веб-сайта, чтобы объекты email_message и email_address разделяли отношение ManytoMany. Я хотел бы получить доступ к свойствам веб-сайта email_address email_message, и я хотел бы сделать это в ModelAdmin email_message. Таким образом, здесь используется несколько уровней ссылок.

Это очень упрощенная версия моего кода, поэтому, пожалуйста, дайте мне знать, если вам нужно что-то, что я пропустил.

models.py

class Email_message(models.Model):
    email_addresses = models.ManyToManyField(Email_address, related_name='email_messages')
    subject = models.CharField(max_length=50)
    body = models.TextField()
    date_time = models.DateTimeField(null=True, blank=True)

class Email_address(models.Model):
    address = models.EmailField()
    contact_name = models.CharField(max_length=50, null=True, blank=True)
    website = models.ForeignKey(Website, on_delete=models.CASCADE, related_name='email_addresses', null=True)

class Website(models.Model):
    domain = models.URLField(default=None)
    searches = models.ManyToManyField(Search, related_name='websites', blank=True)
    def __str__(self):
        return self.domain
    @property
    def get_likely_location(self):
        searches = self.searches.all()
        locations = []
        for search in searches:
            if search.location is not None:
                locations.append(search.location)
        return max(set(locations), key = locations.count)

admin.py

class Email_messageAdmin(admin.ModelAdmin):
    fields = ['id', 'email_addresses', 'date_time', 'subject', 'body', 'preview_random_email']
    readonly_fields = ['id', 'preview_random_email']
    def preview_random_email(self, obj):
        print("This always prints")
        test = obj.email_addresses.first().searches.all()
        print("If things are working, this will print")
        return format_html(test)

Я бы хотел, чтобы вы сосредоточились на этом admin.py классе. Вы можете видеть, что я включил 2 print функций. Как описано в их параметрах, первый всегда печатает, а второй будет печатать только при некоторых обстоятельствах. Он ломается, если я запускаю test = obj.email_addresses.first().searches.all(), но работает, если я изменяю эту строку на что-то более короткое, например test = obj.email_addresses.first().id. Кажется, есть предел тому, насколько глубоко я могу go, что, я не думаю, должно произойти.

Когда возникает проблема, все до строки test = ... будет функционировать, как ожидалось, но все после будет просто проигнорировано. Django не выдает никакой ошибки и даже не признает наличие проблемы. Он просто отказывается от оставшейся части моего кода.

Если это помогает, я также могу сказать, что он ломается таким же образом, когда я запускаю test = obj.email_addresses.first().get_likely_location, но я не уверен, что написание свойства таким способом работает и не хочет заниматься слишком многими вещами одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...