Django:用户的数据uownership

时间:2017-09-13 15:08:32

标签: django django-models django-admin

我正在尝试创建一个简单的应用程序。它有以下型号:

型号:产品

class Product(models.Model):
    product_owner = models.ForeignKey(User, verbose_name='User')
    product_title = models.CharField(max_length=100, null=False, 
verbose_name='Product title')
    product_description = models.TextField(max_length=250, verbose_name='Product description')
    product_qty = models.IntegerField(verbose_name='Quantity')
    product_mrp = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='Maximum retail price')

    product_sku = models.CharField(max_length=100, null=False, unique=True, verbose_name='SKU',help_text='Enter Product Stock Keeping Unit')
    product_barcode = models.CharField(max_length=100, null=False, verbose_name='Barcode')

我只使用django框架提供的内置管理应用程序。通过在Admin类中添加以下内容,我能够仅为相应用户提供产品数据。

class ProductAdmin(ImportExportModelAdmin):
    exclude = ('product_owner',)
    list_display = ['product_title','product_description', 'product_qty', 
                   'product_mrp','product_sku','product_barcode']
    search_fields = ['product_title', 'product_description', 'product_sku', 
                    'product_barcode']
    ordering = ['id']
    list_display_links = ['product_title']

    def get_queryset(self, request):
        if request.user.is_superuser:
            return Product.objects.all()
        return Product.objects.filter(product_owner=request.user)

    def save_model(self, request, obj, form, change):
        if not change:
            obj.product_owner = request.user
        obj.save()

当我刚开始尝试时,我添加了2个用户,User1和User2。 对于User1,我添加了10个产品。然后我登录为User2,User2无法看到User1添加的产品。

现在,当我想为User2添加产品时,如果product_sku字段中存在冲突,这是一个独特的字段,我根本无法添加产品。

如何解决这个问题。我需要每个用户添加他自己的产品,但product_sku对他的产品数据集是唯一的,而不是整个数据库。

1 个答案:

答案 0 :(得分:1)

您应该为sku和用户定义unique_together,而不是在unique=True字段中定义product_sku

class Product(models.Model):
    ...
    class Meta:
        unique_together = (('product_sku', 'product_owner'),)

这将确保每个用户只能拥有一个具有特定sku的产品,但多个用户可以拥有相同的sku。