每个用户的主键(计数)-Django

Primary Key(count) for each user - Django

我有一个 Django 网站,它的一部分在行中列出数据,主键在其中一列中。这很好用,除非我有单独的用户。我在每个模型中使用外键来分隔不同用户的数据。我的问题是每个用户的数据必须在列中有一个数字,该数字按数字递增并且没有任何间距,例如,1,2,3,5 是不好的。如果用户 1 正在上传数据,而用户 2 在中途上传了一行数据,那么如果我使用主键,每个用户的数字将不会按数字顺序排列,用户 1 将读取 1、2、3、5,用户 2 将读取 4。我尝试了 forloop 计数器,但我需要将所有数字分配给该行,并且如果删除一个数字则不会更改。我已经在这里待了 2 周,并且很难描述我的问题。我想我需要某种自定义用户主键,每个用户的主键。非常感谢此时的任何帮助,谢谢!

大概一周后我终于弄明白了。

models.py:

class Sheet_Building(models.Model):
    user = models.ForeignKey(User, default=True, related_name="Building", on_delete=models.PROTECT)
    count_building = models.IntegerField(blank=True, null=True)
    date = models.DateField(blank=True, null=True, verbose_name='Inspection Date')
    time = models.TimeField(blank=True, null=True, verbose_name='Inspection Time')
    inspection_type = models.CharField(max_length=16, choices=INSPECTION_TYPE_BI, blank=True, null=True, verbose_name='Inspection Type')
    flname = models.CharField(max_length=25, blank=True, null=True, verbose_name='Inspector')
    report_date = models.DateField(blank=True, null=True, verbose_name='Report Date')
    department = models.CharField(max_length=29, choices=DEPARTMENT_BI, blank=True, null=True, verbose_name='Department')
    responsible_name = models.CharField(max_length=25, blank=True, null=True, verbose_name='Responsible Person')
    building_address = models.CharField(max_length=52, choices=BUILDING_ADDRESS, blank=True, null=True, verbose_name='Building and Address')
    floor = models.CharField(max_length=8, choices=FLOOR_LEVEL_BI, blank=True, null=True, verbose_name='Floor / Level')
    room = models.CharField(max_length=35, blank=True, null=True, verbose_name='Area / Room')
    location = models.CharField(max_length=10, choices=LOCATION_BI, blank=True, null=True, verbose_name='Location')
    priority = models.IntegerField(blank=True, null=True, verbose_name='Priority')
    hazard_level = models.CharField(max_length=20, choices=HAZARD_LEVEL_BI, blank=True, null=True, verbose_name='Hazard Level')
    concern = models.CharField(max_length=31, choices=CONCERN_BI, blank=True, null=True, verbose_name='Concern')
    codes = models.CharField(max_length=51, choices=CODES_BI, blank=True, null=True, verbose_name='Element and Code')
    correction = models.TextField(max_length=160, blank=True, null=True, verbose_name='Corrective Action')
    image = models.ImageField(blank=True, null=True, verbose_name='Image', upload_to='gallery')
    notes = models.TextField(max_length=500, blank=True, null=True, verbose_name="Inspector's note")

    class Meta:
        ordering = ['-pk']

    def __str__(self):
        return self.flname or 'None'

    def get_absolute_url(self):
        return reverse('list_building')

view.py:

def adddata_building(response):
    if response.method == 'POST':
        form = SheetForm_Building(response.POST, response.FILES)
        if form.is_valid():
            instance = form.save(commit=False)
            instance.user = response.user  #User
            if Sheet_Building.objects.filter(user=response.user).values_list('count_building'):
                instance.count_building = Sheet_Building.objects.filter(user=response.user).aggregate(count_building=Max('count_building'))['count_building'] + 1 #Count
            else:
                instance.count_building = 1
            instance.save()
            response.user.Building.add(instance)
            return redirect('list_building')
    else:
        form = SheetForm_Building()

    return render(response, 'sheets/add_data/add_data_building.html', {'form': form})

HTML:

{% for post in object_list %}
    {{ post.count_building }}
{% enfor %}