Фабричный мальчик - как создать необходимые данные о фабрике (крючки перед генерацией) - PullRequest
0 голосов
/ 05 февраля 2019

примечание: я попытаюсь объяснить сценарий использования с упрощенным сценарием (который может показаться вам странным).

У меня есть 2 модели (которые связаны, нонет внешнего ключа):

# models.py
class User(models.Model):
    name = models.CharField()
    age = models.IntegerField()
    weight = models.IntegerField()
    # there are a lot more properties ... 

class Group(models.Model):
    name = models.CharField()
    summary = JSONField()

    def save(self, *args, **kwargs):
        self.summary = _update_summary()
        super().save(*args, **kwargs)
    def _update_summary(self):
        return calculate_group_summary(self.summary)

# this helper function is located in a helper file
def calculate_group_summary(group_summary):
   """calculates group.summary data based on group.users"""
   # retrieve users, iterate over them, calculate data and store results in group_summary object
   return group_summary

для вышеперечисленных моделей У меня есть такие фабрики:

# factories.py
class UserFactory(factory.DjangoModelFactory):
    class Meta:
        model = User

    name = factory.Sequence(lambda n: "user name %d" % n)
    age = randint(10, 90))
    weight = randint(30, 110))

class GroupFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Group

    name = factory.Sequence(lambda n: "group name %d" % n)
    summary = {
        "users": [34, 66, 76],
        "age": {
            "mean": 0,
            "max": 0,
            "min": 0,
        },
        "weight": {
            "mean": 0,
            "max": 0,
            "min": 0,
        } 
    }

особенность в том, что я обновляю данные JSON в поле group.summary on group.save ().
примечание: мне не нравится перемещать это в сигнал post_save, потому что я хочу избежать "двойного" сохранения (у меня есть поля создания / изменения на месте).

поэтому, когда я использую GroupFactory (), я должен иметь «пользователей» на месте.

Я смотрел на хуки после генерации https://factoryboy.readthedocs.io/en/latest/reference.html#post-generation-hooks,, но янужны "перехватчики перед генерацией".

Есть ли "лучший метод" для генерации пользовательских данных до создания GroupFactory (без создания их вручную в тестовом примере)?что-то вроде «крючка после поколения», но «предварительно»?: |

...