【问题标题】:Django - build a query with these modelsDjango - 使用这些模型构建查询
【发布时间】:2017-03-07 19:09:20
【问题描述】:

目标是:

管理员登录以查看其协会中所有注册成员的列表。管理员不想看到其他协会中的成员,而只想看到他的协会中的成员。

例子:

教练(管理员)希望看到他在皇家马德里(协会)的所有球员,并且对看到他的球队中的其他足球俱乐部(协会)球员不感兴趣。

我已经尝试了很长时间并且没有想法,所以希望你们有一些很棒的想法我可以尝试=D

还是新手,非常感谢您的帮助!

管理员\models.py

class Administrator(AbstractUser):
    ...
    asoc_name = models.CharField(max_length=100)


    class Meta:
        db_table = 'Administrator'

成员\models.py

from pl.admin.models import Administrator


class Member(models.Model):
    member_no = models.AutoField(primary_key=True)
    asoc_name = models.CharField(max_length=100)
    ...

    class Meta:
        db_table = 'Member'


class Association(models.Model):
    asocnumber = models.AutoField(primary_key=True)
    asoc_name = models.CharField(max_length=100)
    user = models.ForeignKey(Administrator)
    member_no = models.ForeignKey(Member)

    class Meta:
        db_table = 'Association'

views.py

 def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if not form.is_valid():
            return render(request, 'admin/signup.html',
                          {'form': form})

        else:
            ...
            asoc_name = form.cleaned_data.get('asoc_name')
            ...
            Administrator.objects.create_user(...
                                              asoc_name=asoc_name,    
                                              ...)
            user = authenticate(...
                                asoc_name=asoc_name,
                                ...)
            return redirect('/')

    else:
        return render(request, 'admin/signup.html',
                      {'form': SignUpForm()})

如果您需要更多信息,请告诉我!

【问题讨论】:

    标签: python django python-2.7 python-3.x django-models


    【解决方案1】:

    好的,因此您正在使用 CharFields 将这些模型链接起来,这在技术上是可行的,但您可能希望使用 ForeignKeys

    这可能意味着代码如下所示:

    class Administrator(AbstractUser):
        ...
        asoc = models.ForeignKey(Association)
    
    
        class Meta:
            db_table = 'Administrator'
    
    class Member(models.Model):
        member_no = models.AutoField(primary_key=True)
        asoc = models.ForeignKey(Association)
        ...
    
        class Meta:
            db_table = 'Member'
    
    
    class Association(models.Model):
        asocnumber = models.AutoField(primary_key=True)
        asoc_name = models.CharField(max_length=100)
        member_no = models.ForeignKey(Member)
    
        class Meta:
            db_table = 'Association'
    

    然后您可以进行所需的各种查询。示例:给定一个管理员用户,获取其关联的所有成员。

    Member.objects.filter(asoc=admin.asoc)
    

    编辑

    好的,当您创建管理员用户时,您需要传入一个关联。一种方法是让选择关联成为注册过程的一部分。因此,例如,您可以将ModelChoiceField 添加到您的注册表单或类似的东西,或者将管理员置于默认关联中。但想法是,当您创建用户时,您已经准备好一个关联对象,并将其传递给 Administrator.create_user。

    【讨论】:

    • 获取 null_value null value in column "member_no_id" violates not-null constraint 的错误。如果我先注册管理员或关联,我会得到空值。有没有办法自动实现这些 id 以避免 null_value?
    • 您的模型中似乎没有 member_no_id。因此,也许您以前有一个,并进行了一些更改,但没有更改数据库。可能尝试修复该问题或重新创建数据库。
    • member_no_id 来自member_no = models.ForeignKey(Member)。尝试重新创建数据库,但同样的事情发生
    • 哦,好的:当你创建 Association 对象时,你是否将成员传递给它?例如。关联 = 关联(...,member_no = 成员)?但是仔细想想,您可能根本不需要该字段,因为每个成员都存储了他的关联,因此关联不需要只跟踪单个成员。
    • 不,这可能是 null_values 的问题 xD 我应该在哪里将关联 ID 传递给管理对象?意见?表格?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2021-06-05
    • 2014-02-03
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多