Обработка из полей таблицы Foreignkey при создании нескольких объектов в django rest? - PullRequest
0 голосов
/ 27 августа 2018

Models.py

class Season(models.Model):
     name = models.CharField()
     statuses = models.CharField()

class Match(models.Model):
     SHOT_CHOICES = (
     ('W', 'Win'),
     ('F', 'Fail'),
     ('D', 'Draw'),
     )
     season = models.ForeignKey(Season, on_delete=models.CASCADE)
     status = models.CharField(choices=STAT_CHOICE, max_length=1)

Мой вид для создания матчей

class CreateMatches(generics.CreateApiView)
    def create(self, request, *args, **kwargs):
            serializer = self.get_serializer(data=request.data, many=True)
            serializer.is_valid(raise_exception=True)
             self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)

status это строка типа «WFFWFDDW», мне нужно извлечь «nth» символ из статусов сезона внешнего ключа в статус «nth» match.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я решил это, переопределив функцию execute_create

def perform_create(self, serializer):
    if type(serializer.validated_data) == list:
        for iter,item in enumerate(serializer.validated_data):
            season = item['season']
            count = season.matches.count()
            status = season.statuses[count+iter]
            item.update({'status':status})
        serializer.save()
0 голосов
/ 28 августа 2018

Поскольку поле status модели Match не зависит от каких-либо входных данных из запроса, вы можете сохранить последний символ, переопределив метод save() для Match модель. Но вы должны установить null=True

class Match(models.Model):
    SHOT_CHOICES = (
        ('W', 'Win'),
        ('F', 'Fail'),
        ('D', 'Draw'),
    )
    season = models.ForeignKey(Season, on_delete=models.CASCADE)
    status = models.CharField(choices=STAT_CHOICE, max_length=1, <b>null=True</b>)

    <b>def save(self, **kwargs):
        if not self.pk:
            self.status = self.season.statuses[-1]

        super().save(**kwargs)</b>
...