Как передать значения из внешнего ключа в вызовы ajax с моделью django - PullRequest
0 голосов
/ 16 марта 2020

У меня довольно простая модель в Django:

class TimeReport(ValidateModelMixin, models.Model):
    created_at = models.DateTimeField(default=datetime.now)
    created_by = models.ForeignKey(Person, on_delete=models.DO_NOTHING)
    year = models.CharField(max_length=9)
    TERM_CHOICES = [
        ('winter', 'winter'),
        ('summer', 'summer')
    ]
    term = models.CharField(max_length=255, choices=TERM_CHOICES)
...

class Person(AbstractUser):
...

Теперь у меня есть представление, которое генерирует шаблон, который делает ajax вызовы после загрузки страницы. Вызов ajax, запрашивающий другое представление:

def get_time_reports_api(request, year, term):
    if request.is_ajax():
        qs = TimeReport.objects.filter(year=year, term=term).all()
        return_value = serializers.serialize('json', qs)
    else:
        return_value = 'fail'

    mimetype = "application/json"
    return HttpResponse(return_value, mimetype)

Очевидно, это представление возвращает внешний ключ в поле created_by.

Как я могу убедиться, что я передаю first_name и last_name Person с каждой TimeReport записью?

Если я не ошибаюсь, я должен использовать annotate, но я борюсь с как это должно быть воедино ...

1 Ответ

0 голосов
/ 16 марта 2020

Вы должны использовать менеджер моделей, чтобы сделать это, попробуйте это:

class PersonManager(models.Manager):
    def get_by_natural_key(self, first_name, last_name):
        return self.get(first_name=first_name, last_name=last_name)

class Person(AbstractUser):
    ...
    objects = PersonManager()

    # add this function
    def natural_key(self):
        return (self.first_name, self.last_name)

И добавьте use_natural_foreign_key=True и use_natural_primary_keys=True для сериализации:

if request.is_ajax():
        qs = TimeReport.objects.filter(year=year, term=term).all()
        return_value = serializers.serialize('json', qs, use_natural_foreign_keys=True, use_natural_primary_keys=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...