tortoise / aerich

A database migrations tool for TortoiseORM, ready to production.
https://github.com/tortoise/aerich
Apache License 2.0
804 stars 90 forks source link

[BUG] Sort m2m fields before comparing them with `diff(...)` #271

Open mykolasolodukha opened 1 year ago

mykolasolodukha commented 1 year ago

What?

Why?

Otherwise, if one adds more m2m fields, the diff would produce the action="change" result, instead of the action="add" one. See:

How to test?

Try migrating this:

# models.py
class User(tortoise.Model):

    id = fields.BigIntField(pk=True, generated=False)

    groups: fields.ManyToManyRelation[Group]

class Group(tortoise.Model):

    users: fields.ManyToManyRelation[User] = fields.ManyToManyField(
        "bot.User", through="group__user", related_name="groups"
    )

To this:

# models.py
class User(tortoise.Model):

    id = fields.BigIntField(pk=True, generated=False)

    groups: fields.ManyToManyRelation[Group]
    admin_in_groups: fields.ManyToManyRelation[Group]

class Group(tortoise.Model):

    users: fields.ManyToManyRelation[User] = fields.ManyToManyField(
        "bot.User", through="group__user", related_name="groups"
    )
    admins: fields.ManyToManyRelation[User] = fields.ManyToManyField(
        "bot.User", through="group__admin", related_name="admin_in_groups"
    )
aerich migrate --name "add_group_admins"

Anything else?

I think this kind of sorting might help with other types of fields as well, but I have no time to investigate that right now. The fix in this PR is urgent to me, though.

LanceMoe commented 1 year ago

I have the same problem, aerich doesn't work at all. This PR solves the problem. Please merge this!