简体   繁体   English

如何链接/或组合我的三个 Django 模型以更好地最大化关系和效率

[英]How can I link/or combine my three Django models to better maximize relationship and efficency

Im trying to model out my dB for my Django app.我试图为我的 Django 应用程序输出我的分贝。

I'm pretty content with that I have so far, only I have two questions regarding my models.到目前为止,我很满意,只是我对我的模型有两个问题。

Here's a quick run-through of them.这是它们的快速浏览。

UserBuckets contains every bucket a user has created. UserBuckets包含用户创建的每个存储桶。

TotalBuckets contains the total number of buckets a user has created. TotalBuckets包含用户创建的桶的总数。

Bucket Contains information for whats inside each user bucket. Bucket包含有关每个用户存储桶内内容的信息。

class UserBuckets(models.Model):
    
    username = models.ForeignKey(UserModel.username)
    bucket_name = models.CharField()

    def get_all_buckets(self):
        all_buckets = UserBuckets.objects.all('bucket_name')
        return all_buckets

    def __str__(self):
        return self.bucket_name


class TotalBuckets(models.Model):

    username = models.ForeignKey(UserBuckets.username)
    total_buckets = models.IntegerField(blank=True, null=True)

    def total_buckets_calc(self):
        self.total_buckets = TotalBuckets.objects.aggregate(Sum('bucket_name', distinct=True))
        self.save()
    
    def __str__(self):
        return self.total_buckets

class Bucket(models.Model):

    owner = models.ManyToManyField(UserBuckets.username)
    bucket = models.ForeignKeyField(UserBuckets.bucket_name, on_delete=models.CASCADE)
    stocks = ArrayField(models.CharField(max_length=6),size=10) 
    stocks_in_bucket = models.IntegerField(blank=True, null=True)
    created = models.DateField(auto_now_add=True)
    slug = models.SlugField(unique=True, blank=True)

    def total_stocks_calc(self):
        self.stocks_in_bucket = Bucket.objects.aggregate(Sum('stocks_in_bucket', distinct=True))
        self.save()

    def get_absolute_url(self):
        return reverse("bucket:bucket-view", kwargs={"slug": self.slug})

    def __str__(self):
        return self.stocks

Here are my two questions:这是我的两个问题:

1. I can see the argument of combining UserBuckets + TotalBuckets , however my only problem with that is the repeating the same datapoint for every new object that gets created. 1.我可以看到结合UserBuckets + TotalBuckets的论点,但我唯一的问题是为每个新创建的 object 重复相同的数据点。 To keep things "clean", I separated them.为了保持“干净”,我将它们分开。 Is this the "correct" procedure?这是“正确”的程序吗?

2. How can I properly reference that each bucket is an object based off of UserBuckets . 2.如何正确引用每个bucket是基于 UserBuckets 的UserBuckets I used a foreign key and a many-to-many key but doesn't that only cover the relationship basis?我使用了外键和多对多键,但这不只涵盖关系基础吗?

Thank you for any help.感谢您的任何帮助。

You only need the User-object and the Bucket-objects related to the user to find every bucket the user has created and the number of buckets the user has.您只需要 User-object 和与用户相关的 Bucket-objects 即可找到用户创建的每个存储桶以及用户拥有的存储桶数量。

class User(models.Model):
    username = models.CharField()

class Bucket(models.Model):

    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='buckets')
    stocks = ArrayField(models.CharField(max_length=6),size=10) 
    stocks_in_bucket = models.IntegerField(blank=True, null=True)
    created = models.DateField(auto_now_add=True)
    slug = models.SlugField(unique=True, blank=True)

    def total_stocks_calc(self):
        self.stocks_in_bucket = Bucket.objects.aggregate(Sum('stocks_in_bucket', distinct=True))
        self.save()

    def get_absolute_url(self):
        return reverse("bucket:bucket-view", kwargs={"slug": self.slug})

    def __str__(self):
        return self.stocks



EXAMPLE

user = User('Gabbeh')
b1 = Bucket(owner=user, ...)
b2 = Bucket(owner=user, ...)

all_buckets_owned_by_user = User.buckets()  # from related_name
all_buckets_owned_by_user = User.bucket_set()  # djangos naming wihtout setting related name
# or 
all_buckets_owned_by_user = Buckets.objects.filter(owner=user)

# To count just do .count() on the end of either query above.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM