使用两个外键动态访问“朋友”模型到“个人资料”

时间:2017-12-28 14:50:55

标签: django django-models django-templates django-views

我创建了一个DECLARE @newname varchar(500), @newmdf varchar(500), @newldf varchar (500), @yearnum int, @prevyear int, @command1 varchar(max), @command2 varchar(max), @command3 varchar(max), @command4 varchar(max), @command5 varchar(max) SET @yearnum = YEAR(GETDATE()) SET @prevyear = @yearnum - 2000 SET @newname = 'ugocity' + CONVERT(varchar(4),@prevyear) SET @newmdf = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\' + @newname +'.mdf' SET @newldf = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocitylog.ldf' SET @command1 = 'sp_renamedb ''ugocity2017'', ''' + @newname + '''' SET @command2 = 'xp_cmdshell ''RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity2017.mdf", "' + @newname + '.mdf"''' SET @command3 = 'xp_cmdshell ''RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity1_log.mdf", "ugocitylog.ldf"''' SET @command4 = 'sp_detach_db @dbname = ''' + @newname + '''' SET @command5 = 'sp_attach_db @dbname = ''' + @newname + ''' , ' + ' @filename1 = ''' + @newmdf + ''' , ' + '@filename2 = ''C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocitylog.ldf''' EXECUTE (@command1) USE [master] EXECUTE (@command4) EXECUTE sp_configure 'show advanced options' , 1 RECONFIGURE EXECUTE sp_configure 'xp_cmdshell' , 1 RECONFIGURE EXECUTE (@command2) EXECUTE xp_cmdshell 'RENAME "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\ugocity1_log.mdf", "ugocitylog.ldf"' EXECUTE sp_configure 'xp_cmdshell' , 0 RECONFIGURE EXECUTE sp_configure 'show advanced options' , 0 RECONFIGURE EXECUTE (@command5) 模型,该模型由两个Friend模型实例组成。首先是单独模型的原因是Profile模型具有与“朋友”关系相关的特殊属性。

在此Friend模型中,我还会跟踪Friend&关系的requester因为它对我的网站很重要 - 这要求我为每个网站都有一个单独的字段,它们是accepter模型的FK。以下是两种模式:

Profile

使用此结构,在我想要检索单个class Profile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True) profile_picture = models.ImageField( upload_to=profile_photo_upload_loc, blank=True, null=True, created = models.DateTimeField(auto_now_add=True) class Friend(models.Model): requester = models.ForeignKey(Profile, related_name='is_requester') accepter = models.ForeignKey(Profile, related_name='is_accepter') requester_asks = models.CharField(max_length=60, null=True) accepter_asks = models.CharField(max_length=60, null=True) 参与的Friend个实例的所有的实例中,我需要进行两个查询:一个用于Profile的用户,另一个用于个人资料为requester的用户。这两个查询集的组合为我提供了accepter所属的所有Friend关系的总列表 - 在制作消息收件箱时我需要这个总列表。

尝试创建一个消息ListView,我做了一个这样的视图:

Profile

问题在于,虽然它允许我在模板中访问class MessageListView(ListView): template_name = 'chat/listview.html' context_object_name = 'friend_list' def get_queryset(self, *args, **kwargs): profile = Profile.objects.get(user__username=self.request.user) as_requester_list = Friend.objects.filter(requester=profile) as_accepter_list = Friend.objects.filter(accepter=profile) return list(chain(as_accepter_list, as_requester_list)) 个对象属性,但我似乎无法找到一种方便的方法来检索属于的必要Friend属性朋友关系的另一个参与者。

所以在模板中,我可能会有这样的事情:

Profile

我可以访问{% for friend in friend_list %} {{friend.requester_asks}} <br /> {% endfor %} 模型的属性,但如何访问其他朋友的Friend对象)属性,例如Profile
单个用户可以是profile_picturerequester这一事实使访问accepter模型属性的能力变得复杂。

提前致谢。

编辑:我意识到这可能需要对模型关系进行重大改变。我对任何建议持开放态度。

1 个答案:

答案 0 :(得分:1)

我会利用这样一个事实,即您正在评估视图中的查询集,并使用指向不是原始用户的FK的属性来注释它们。

for friend in as_requester_list:
    friend.other_friend = friend.accepter
for friend in as_accepter_list:
    friend.other_friend = friend.requester

现在您可以遍历模板中的friend_list,然后访问

{{ friend.other_friend.profile_picture }}

等等。