gpt4 book ai didi

django - 在 Django 中与其他用户共享对象

转载 作者:行者123 更新时间:2023-12-03 01:12:51 25 4
gpt4 key购买 nike

我正在 Django 中对一个相当复杂的系统进行建模。我将仅在此发布其中的相关部分,并且我将展示简化的用例图以更好地表达我的想法。

我基本上有两种类型的用户:卖家和客户。

  1. 卖家获取客户,这意味着卖家现在拥有客户的个人信息并可以与他/她互动。
    卖家无法与他未获得的客户进行互动。 enter image description here

  2. 卖方创建相关对象的模型层次结构(子级别中的每个模型都通过外键连接到其父级)
    enter image description here

  3. 卖家与一些客户共享创建的box对象及其所有相关对象 enter image description here

  4. 授权客户可以:

    • R-ead Box模型的一些属性
    • R-ead 和 U-pdate Item 模型的一些属性
    • 无法访问Item模型的某些属性

    enter image description here

问题:

  • A:在用户之间建立关系的最佳方法是什么?
    我见过django-relationship可能会有用。
  • B:在 Django 中共享模型实例的最佳方法是什么与其他用户?
    就我而言,默认情况下,如果未明确共享,客户无法访问卖家创建的任何模型。
  • C:如果我只共享 Box 模型,是否隐含地意味着它的所有相关模型(Box 模型的外键)也将被共享?<
  • D:控制字段级别权限的最佳方法是什么每个用户?
    可以django-guardian在这里有用吗?

最佳答案

答:在用户之间建立关系的最佳方法是什么?

并非所有用户都是生来平等的。 django-relationship 在任意用户之间创建任意关系,这可能不是您想要的。您真正想要的是将这种关系严格限制为 Seller -> Customer

# This example assumes that both customers and sellers have user table entries.
from django.contrib.auth.models import User

class Customer(User): pass

class Seller(User):
acquired_customers = ManyToManyField(Customer,
related_name="acquired_sellers")

def acquire(customer):
" A convenience function to acquire customers "
self.acquired_customers.add(customer.id)

B:与其他用户共享 Django 中的模型实例的最佳方法是什么?

您可以使用ManyToManyField的自定义“通过”模型来添加您想要跟踪的额外信息。在本例中,我们将添加卖家以及共享时的自动时间戳。这使您可以执行一些操作,例如显示已与您共享的产品(按共享时间排序)以及将其发送给您的卖家的名称。

# Install mptt for heirararchical data.
from mptt.models import MPTTModel

class Box(MPTTModel):
" Nestable boxen for your Items "
owner = ForeignKey(Seller)
title = CharField(max_length=255)
shared_with = ManyToManyField(Customer,
related_name='boxes_sharedwithme', through=SharedBox)

class Item(Model):
" A shareable Item "
box = ForeignKey(Box)
title = CharField(max_length=255)

class SharedBox(Model):
" Keeps track of who shares what to whom, and when "
when = DateTimeField(auto_now_add=True)
box = ForeignKey(Box)
seller = ForeignKey(Seller)
customer = ForeignKey(Customer)

#----------------------------

# share an Item with a Customer
def share_item(request, box_id, customer_id, **kwargs):
# This will fail if the user is not a seller
seller = request.user.seller
# This will fail if the seller is not the owner of the item's box
box = Box.objects.get(
id=box_id, owner=seller)
# This will fail if the seller has not acquired the customer
customer = Customer.objects.get(
id=customer_id, acquired_sellers=seller)
# This will share the item if it has not already been shared.
SharedBox.objects.create_or_update(
box=box, seller=seller, customer=customer)
return HttpResponse("OK")

C:如果我只共享 Box 模型,是否隐含地意味着它的所有相关模型(#Box 模型的外键)也将被共享?

隐式权限是“业务逻辑”,这意味着您可能需要自己实现它。幸运的是,Django 的权限系统是可插入的,因此您可以添加自己的规则来递归层次结构以检查权限。或者,您可以创建自定义管理器,将适当的规则添加到使用的查询中。

from django.db.models import Manager
from django.db.models.query import EmptyQuerySet

class ItemManager(Manager):

def visible(user):
iqs = self.get_query_set()
oqs = EmptyQuerySet()
# add all the items a user can see as a seller
try: oqs |= iqs.filter(box__owner=user.seller)
except Seller.DoesNotExist: pass
# add all the items a user can see as a customer
try: oqs |= iqs.filter(box__shared_with=user.customer)
except Customer.DoesNotExist: pass
# return the complete list of items.
return oqs

class Item(Model): objects = ItemManager()

class ItemListView(ListView):
model = Item

def get_queryset(request):
return self.model.objects.visible(request.user)

D:控制每个用户的字段级别权限的最佳方法是什么?

如果这需要超细粒度或针对每个用户,那么 django-guardian 是最佳选择。如果权限是基于规则的,那么您最好使用一个简单的字段,以降低数据库查询的复杂性。

class Property(Model):
title = CharField(max_length=255)
units = CharField(max_length=10,
choices=UNIT_TYPES, null=True, blank=True)

# -- A simple field that toggles properties for all users

class ItemProperty(Model):
item = ForeignKey(Item)
property = ForeignKey(Property)
value = CharField(max_length=100)
customer_viewable = BooleanField(default=False)
customer_editable = BooleanField(default=False)

# -- A simple field that defines user classes who can view/edit

from django.contrib.auth.models import Group

class ItemProperty(Model):
item = ForeignKey(Item)
property = ForeignKey(Property)
value = CharField(max_length=100)
viewable_by = ForeignKey(Group)
editable_by = ForeignKey(Group)

免责声明:这些是我对此主题的看法。 Django 社区内对授权的看法非常分散。永远不会有一种“最佳”方法来做任何事情,因此请仔细考虑您是否需要真正通用的东西并能承受数据库点击,或者您是否需要快速且特定于业务的东西并能承受灵 active 的损失。

关于django - 在 Django 中与其他用户共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17645960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com