Django UniqueConstraint不';t与ManyToManyField合作,出现异常FieldDoesNotExist

Django UniqueConstraint不';t与ManyToManyField合作,出现异常FieldDoesNotExist,django,django-models,django-migrations,Django,Django Models,Django Migrations,从ForeignKey在Shop和user之间切换到ManyToManyField时,迁移停止工作。我希望商店能够同时由不同的用户拥有: class Shop(models.Model): name = models.CharField('name', max_length=120) #user = models.ForeignKey(User, on_delete=models.CASCADE) ##before shopuser= models.ManyToMan

ForeignKey
Shop
user
之间切换到
ManyToManyField
时,迁移停止工作。我希望商店能够同时由不同的用户拥有:

class Shop(models.Model):
    name = models.CharField('name', max_length=120)
    #user = models.ForeignKey(User, on_delete=models.CASCADE)   ##before
    shopuser= models.ManyToManyField(User, related_name="shopusers", blank=True)    ##after

    class Meta:
        constraints = [models.UniqueConstraint(fields=['shopuser', 'name'], name='user cant have the same shop twice!')] 
    
    ## after:
    @property
    def get_shopuser(self):
        return ", ".join([u.username for u in self.shopuser.all()])

class Warehouse(models.Model):
    address = models.CharField('address', max_length=120)
    user = models.ManyToManyField(User, related_name="User", blank=True)
django.core.exceptions.FieldDoesNotExist:新闻商店没有名为“shopusers”的字段

我认为通过选择一个相关的名称,我可以使用与
用户
模型的多个关系?我已尝试完全删除我的数据库(和迁移文件夹)并从一开始迁移,但没有帮助:(

我将调用代码的示例:

admin.py:

@admin.register(Shop)
class ShopAdmin(admin.ModelAdmin):
    list_display = ("name", "related_shopuser")
    list_filter = ("name", "shopuser")
    fieldsets = [("Requrired Information", {"description": "These fields are required", 
                                            "fields": (("name", "shopuser"))}),]

    def related_shopuser(self, obj):
        return obj.get_shopuser
Djanog migrations从
FieldDoesNotExist(“%s”没有名为“%s”(self.object\u name,field\u name))的
新闻商店
从何处获取
,请尝试删除迁移文件,或至少删除第一次添加用户字段的迁移,如果不需要(项目已在生产中),请尝试删除迁移文件,或至少删除第一次添加用户字段的迁移
ManyToManyField
上的
UniqueConstraint
将无法按预期工作。如果要强制执行该约束,应定义一个中间模型,并使用参数将其连接起来

为了简单起见,我假设您有一个如下的模型

class Shop(models.Model):
    name = models.CharField('name', max_length=120)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=[
                    'user',
                    'name'
                ],
                name='user cant have the same shop twice!'
            )
        ]
现在,您需要将
用户
字段从
外键

注意:我已将字段名从
user
更改为
users
,这更合适

方法1:删除唯一约束 问题
ManyToManyField
上的
UniqueConstraint
将无法按预期工作。如果要强制执行该约束,应定义一个中间模型,并使用参数将其连接起来

为了简单起见,我假设您有一个如下的模型

class Shop(models.Model):
    name = models.CharField('name', max_length=120)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=[
                    'user',
                    'name'
                ],
                name='user cant have the same shop twice!'
            )
        ]
现在,您需要将
用户
字段从
外键

注意:我已将字段名从
user
更改为
users
,这更合适

方法1:删除唯一约束
benn在那里,这样做了,正如我在上一句话中所说的。但是你删除了你的迁移文件吗?不仅仅是数据库,因为当你这样做时,所有以前的模型历史迁移都会被删除,并且你对新字段或更改没有任何问题。我删除了
migrations
文件夹和数据库。我添加了som来自admin.py的e代码。除了模型,这个错误是否与我代码中的一些错误有关,py?这个错误通常与字段中的迁移和更改有关,我真的认为您没有删除与此模型相关的所有迁移。我今天在我的一个项目中遇到了同样的问题,因为我更改了一个
FKField
to一个
M2MField
像你一样,我找到的唯一方法是删除模块的迁移。另一方面,你需要进入迁移,并在新数据库中指定如何处理该字段。benn在那里,完成了,正如我最后一句话所述。但是你删除了迁移文件吗?不仅仅是数据库,因为当您执行此操作时,所有以前的模型历史迁移也将被删除,并且您在新字段或更改方面没有任何问题。我删除了
migrations
文件夹和数据库。我从admin.py添加了一些代码。除了模型,py之外,我的代码中的一些错误是否也会导致此错误?该错误是最常见的错误关于字段的迁移和更改,我真的认为您没有删除与此模型相关的所有迁移。我今天在一个项目中遇到了相同的问题,因为我像您一样将
FKField
更改为
M2MField
,我发现的唯一方法是删除模块的迁移。另一方面,您我需要进入迁移,并在新数据库中指定如何处理该字段。
class ShopUserIntermediateModel(models.Model):
    shop = models.ForeignKey('Shop', models.CASCADE)
    user = models.ForeignKey(User, models.CASCADE)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=[
                    'shop',
                    'user'
                ],
                name='user cant have the same shop twice!'
            )
        ]


class Shop(models.Model):
    name = models.CharField('name', max_length=120)
    users = models.ManyToManyField(User, through=ShopUserIntermediateModel)