Django过滤外键项

问题描述

我制作了简单的日常清洁检查应用程序。该应用程序很简单,用户可以观察某些区域并检查区域是否干净。毕竟,用户需要向批准其日常清洁工作的当局报告。此处的授权者是签发者,检查者和签名者。这里的cln_daily模型代表每天的清洁工作,其中将包含用户模型的制造者,检查者和签名者。

我有一个名为 user 的应用,该应用在 model.py

中汇总了 User 模型
class User(AbstractUser):
    username = models.CharField(max_length=50,unique=True)
    email = models.EmailField(_('email address'),unique=True)
    phone = models.IntegerField(_('phone number'),unique=True,blank=True,null=True)

用户与组查询集具有“多对多关系”:创建者,检查者,签名者

>>> print(Group.objects.all()) 
<QuerySet [<Group: maker>,<Group: checker>,<Group: signer>]>

在另一个名为 cleaning 的应用程序中,我有 cln_daily 模型,该模型根据用户组与该 User 模型具有外键关系

class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey(User,verbose_name="Maker's Signature",on_delete=models.CASCADE,related_name="makerSignature",null=True,)
   user_checker = models.ForeignKey(User,verbose_name="Checker's Signature",related_name="checkerSignature",null=True)
   user_signer = models.ForeignKey(User,verbose_name="Signer's Signature",related_name="signerSignature",null=True)

所以我的意思是 user_maker 查询集的用户仅属于组 maker user_checker 用户仅属于组 checker ,而 user_signer 查询集的用户仅属于组 signer 。 如何在该 model.py 中表达过滤后的用户模型?

解决方法

我想我对您的问题有所了解,您想以一种简单的方式加入表格,对吗? ,我建议看看thisthis

并以这种方式修复这些模型关系,因为到时候就会出现问题:

User

与其在ForeignKeyField中使用get_user_model(),不如使用用户class cln_daily(models.Model): . . user_maker = models.ForeignKey('myapp.User',verbose_name="Maker's Signature",on_delete=models.CASCADE,related_name="makerSignature",blank=True,null=True,) user_checker = models.ForeignKey('myapp.User',verbose_name="Checker's Signature",related_name="checkerSignature",null=True) user_signer = models.ForeignKey('myapp.User',verbose_name="Signer's Signature",related_name="signerSignature",null=True) 或将此模式用作str(最好是先将其导入代码中):>

import SwiftUI

struct WeekDay {
    var dayOfTheWeek: String
    var numberOfTheDay: String
    var isActual: Bool = false
    var isBeforeActual: Bool = false
    var isAllCompleted: Bool = false
    var isLeftConnected: Bool = false
    var isRightConnected: Bool = false
}

struct WeekListView: View {
    
    var week: [WeekDay] = [
        WeekDay(dayOfTheWeek: "PO",numberOfTheDay: "10",isBeforeActual: true,isAllCompleted: true,isLeftConnected: false,isRightConnected: true),WeekDay(dayOfTheWeek: "ÚT",numberOfTheDay: "11",isLeftConnected: true,WeekDay(dayOfTheWeek: "ST",numberOfTheDay: "12",isRightConnected: false),WeekDay(dayOfTheWeek: "ČT",numberOfTheDay: "13",isAllCompleted: false,WeekDay(dayOfTheWeek: "PÁ",numberOfTheDay: "14",WeekDay(dayOfTheWeek: "SO",numberOfTheDay: "15",isActual: true,isBeforeActual: false ),WeekDay(dayOfTheWeek: "NE",numberOfTheDay: "16",isBeforeActual: false,]

    var body: some View {
        HStack {
            ForEach(week,id: \.dayOfTheWeek) { weekDay in
                    Button(action: {
                    },label: {
                        VStack {
                            Text(weekDay.dayOfTheWeek)
                                .font(.system(size: 12))
                                .foregroundColor(weekDay.isActual ? Color.white : Color.gray)
                            Text(weekDay.numberOfTheDay)
                                .font(.system(size:18))
                                .fontWeight(.bold)
                                .foregroundColor(weekDay.isActual ? Color.white : Color.black)
                        }
                        .padding(8)
                    })
                    .background(
                            weekDay.isActual
                                    ? Color.purple
                                    : weekDay.isBeforeActual
                                    ? weekDay.isAllCompleted ? Color.green : Color.red
                                    : Color.white
                    )
                    .cornerRadius(
                            radius: 10.0,corners: !weekDay.isLeftConnected && !weekDay.isRightConnected
                                    ? [.topLeft,.bottomLeft,.topRight,.bottomRight]
                                    : weekDay.isLeftConnected && weekDay.isRightConnected
                                    ? []
                                    : !weekDay.isLeftConnected
                                    ? [.topLeft,.bottomLeft]
                                    : [.topRight,.bottomRight]
                    )
            }
        }
    }

}

struct CornerRadiusStyle: ViewModifier {
    var radius: CGFloat
    var corners: UIRectCorner

    struct CornerRadiusShape: Shape {

        var radius = CGFloat.infinity
        var corners = UIRectCorner.allCorners

        func path(in rect: CGRect) -> Path {
            let path = UIBezierPath(roundedRect: rect,byRoundingCorners: corners,cornerRadii: CGSize(width: radius,height: radius))
            return Path(path.cgPath)
        }
    }

    func body(content: Content) -> some View {
        content
                .clipShape(CornerRadiusShape(radius: radius,corners: corners))
    }
}

extension View {
    func cornerRadius(radius: CGFloat,corners: UIRectCorner) -> some View {
        ModifiedContent(content: self,modifier: CornerRadiusStyle(radius: radius,corners: corners))
    }
}

struct WeekListView_Previews: PreviewProvider {
    static var previews: some View {
        WeekListView()
    }
}

因为如果您是django的新手,那么及时地迁移可能是迁移问题

,

经过长时间搜索。我通过解决形式欺骗了它

class MCSForm(forms.ModelForm):
    class Meta:
        model = cln_daily
        fields = ("__all__")
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['user_maker'].queryset = User.objects.filter(groups__name='maker')
        self.fields['user_checker'].queryset = User.objects.filter(groups__name='checker')
        self.fields['user_signer'].queryset = User.objects.filter(groups__name='signer')

,

我有更好的答案,而不是用形式欺骗他们。在FKField中使用 limit_choices_to

User = get_user_model()
class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey(User,limit_choices_to={'groups__name':'maker'})
   user_checker = models.ForeignKey(User,limit_choices_to={'groups__name':'checker'})
   user_signer = models.ForeignKey(User,limit_choices_to={'groups__name':'signer'})